求每个点的圆心的边界值,按从小到大排序之后,
如果当前最右边的点比下一个点最左边的值大,则ans++;
如果当前点最右边的值比下一个点最右边的值大,则改变临界值
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
typedef struct
{
double xl;
double xr;
}coordinate;
int cmp(const void* m,const void* k){
return ((coordinate*)m)->xl < ((coordinate*)k)->xl?-1:1;
}
int main(){
int num,x=0,y=0,r,k=0,i,ans,flag;
coordinate coo[1000]={0};
double min = 0;
while(scanf("%d %d",&num,&r),num!=0&&r!=0){
k++;
flag = 0;
for(i=0;i<num;i++){
scanf("%d %d",&x,&y);
if(r<y){
flag=1;
}
else {
coo[i].xl=x-sqrt(r*r-y*y);
coo[i].xr=x+sqrt(r*r-y*y);
}
}
if(flag) {
printf("Case %d: %d\n",k,-1);
continue;
}
qsort(coo,num,sizeof(coordinate),cmp);
min = coo[0].xr;
ans=1;
for(i=1;i<num;i++){
if(min < coo[i].xl) {
ans++;
min = coo[i].xr;
}
else{
if(coo[i].xr < min )
min = coo[i].xr;
}
}
printf("Case %d: %d\n",k,ans);
}
return 0;
}