这里我犯了几个基础性的错误:在排序比较的时候没有用大于小于号,用的是减号,于是就出现问题
不能用qsort 的原因我也不知道,多用double类型的量
定义结构体数组的时候,如果用了typedef,就需要在结构体外定义数组
d<0的时候在 比较 纵坐标和 d 大小的时候就已经排除在外了
题目的思路:
if(last>a[i].r){ last=a[i].r; } else if(last<a[i].f){ last=a[i].r; ans++; }这里维护了一个值 last,这个表示一个区间的右边界,出现的三种情况通过以上的代码筛选得到正确的答案
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; typedef struct position{ double f,r; }k; k a[1010]; int cmp(position x,position y) { return x.r<y.r; } int main() { int n,d,coun=1; double tempa,b; while(scanf("%d%d",&n,&d)!=EOF) { int tag=1; if(n==0&&d==0){ tag=0; break; } for(int i=0;i<n;i++){ scanf("%lf%lf",&tempa,&b); if(b>d||tag==0){ tag=0; continue; } double temp=sqrt(d*d-b*b); a[i].f=-temp+tempa; a[i].r=temp+tempa; } int ans=1; if(tag){ sort(a,a+n,cmp); double last=a[0].r; for(int i=1;i<n;i++){ if(last>a[i].r){ last=a[i].r; } else if(last<a[i].f){ last=a[i].r; ans++; } } printf("Case %d: %d\n",coun++,ans); } else printf("Case %d: -1\n",coun++); } return 0; }