贪心
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct Radar {
double start,end;
} radar[1005];
bool cmp(Radar a,Radar b) {
return a.start<b.start;
}
int main() {
int n,d,x,y,m,num,flag;
double l,r;
m = 1;
while(scanf("%d%d",&n,&d)) {
if(!n && !d) //如果为0
break;
flag = true;
for(int i = 0; i < n; i++) {
scanf("%d%d",&x,&y);
if(y > d)
flag = false;
radar[i].start = x - sqrt(d * d - y * y); //勾股定理
radar[i].end = x + sqrt(d * d - y * y); //区间覆盖范围
}
if(!flag) {
printf("Case %d: -1\n",m++);
continue;
}
sort(radar,radar + n,cmp); //排序 n为岛屿数目
num = 1,l = radar[0].start,r = radar[0].end;//l和r是double l为最左端的区间的左端 r为右端
for(int i = 1; i < n; i++) {
if(radar[i].start >= l && radar[i].end <= r) { // 某两块区间存在包含关系
l = radar[i].start;
r = radar[i].end;
} else if(radar[i].start <= r && radar[i].end >= r) //某两个区间交叉
l = radar[i].start;
else if(radar[i].start > r) { //两个区间没有交集
l = radar[i].start;
r = radar[i].end;
num++;
}
}
printf("Case %d: %d\n",m++,num);
}
return 0;
}