///贪心,将每个岛屿作为圆心,计算出在坐标轴上满足条件的区间,然后将所有的区间从大 ///到小进行排序,将下一个区间的左边界与上一个区间的右边界进行比较,并更新数据。 #include<stdio.h> #include<stdlib.h> #include<math.h> typedef struct node { double l,r; }coordinate; coordinate position[1005]; int n,d; int compare(const void *_a,const void *_b) { coordinate *a=(coordinate*)_a; coordinate *b=(coordinate*)_b; return a->l>b->l?1:-1; } int main() { ///freopen("in.txt","r",stdin); ///freopen("out.txt","w",stdout); int k=1; while(scanf("%d%d",&n,&d)!=EOF) { if(n==0&&d==0) break; int i,j,end=0,t=1,x,y; if(d<=0)end=1; for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); if(y>d)end=1; if(!end) { position[i].l=x-sqrt((double)(d*d-y*y)); position[i].r=x+sqrt((double)(d*d-y*y)); } } if(end) printf("Case %d: -1/n",k++); else { qsort(&position[1],n,sizeof(coordinate),compare); double right=position[1].r; for(i=2;i<=n;i++) { if(position[i].l>right)///则需要一个新的雷达 { t++; right=position[i].r; } else { if(position[i].r<right)///更新最右点的坐标 right=position[i].r; } } printf("Case %d: %d/n",k++,t); } } return 0; }