Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
137022 爱新觉罗·赵文卿·传统美德 空间定位2 C++ 通过 100 0 MS 248 KB 2174 2024-03-09 17:00:28

Tests(4/4):


#include<stdio.h> #include<string.h> #include<stack> #include<math.h> #include<iostream> #include<algorithm> using namespace std; struct zuobiao//定义存储左右坐标的结构体数组 { double left; double right; } a[10001]; bool cmp(zuobiao x,zuobiao y) { return x.left<y.left;//按照左坐标升序排列 } int main() { int N; scanf("%d",&N); while(N--) { int n;//这个n要定义为int,否则后面调用sort排序会报错 double w,h; scanf("%d%lf%lf",&n,&w,&h); for(int i=0; i<n; i++) { double xi,ri; scanf("%lf%lf",&xi,&ri); double flag; if(ri>h/2) flag=sqrt(ri*ri-h*h/4); else flag=0.0; a[i].left=xi-flag; a[i].right=xi+flag; } sort(a,a+n,cmp); int sum=0;//记录总数 double star=0.0,flag;//flag先记录右坐标然后再传递给star for(int i=0;i<n;i++) { if(a[i].left<=star)//排序后刚开始的左坐标肯定小于等于0,否则就不可能覆盖全 { flag=a[i].right;//暂时存储右坐标 while(a[i].left<=star)//下一个装置的左坐标一定要小于上一个装置的右坐标,否则无法完全覆盖 {//这个循环就是在满足“下一个装置左坐标小于上一个装置右坐标”的前提下,寻找下一个装置 flag=max(flag,a[i].right);//较大的坐标作为右坐标给flag i++;//寻找下一个满足条件的装置 if(i==n)//如果没有了,那就结束吧 break; } star=flag;//star记录满足条件的下一个装置的右坐标 i--;//退回,准备继续寻找下一个满足条件的装置 sum++;//记录数量 } if(star>=w) break; } if(star>=w) printf("%d\n",sum); else printf("0\n"); } return 0; }


测评信息: