Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
138867 陈家宝 空间定位2 C++ 解答错误 25 0 MS 252 KB 1858 2024-03-19 16:41:30

Tests(1/4):


#include<bits/stdc++.h> 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; cin>>N; while(N--){ int n;//这个n要定义为int,否则后面调用sort排序会报错 double w,h; cin>>n>>w>>h; for(int i=0; i<n; i++){ double xi,ri; cin>>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)cout<<sum; else cout<<0; } return 0; }


测评信息: