不妨对于每个需要被监视的点转化为在x轴上可以选择的区间。这样就变成了在n个区间,每个区间需要出现一个点,求最小点数,贪心即可。记录一个last表示最后一个监视器的坐标,按照左端点升序排序,若当前点左端点大于last,则新建一个监视器,last为该区间右端点,否则last为min(last,r)。
const int N = 1e3 + 79;
int x, y, n, d;
struct inter {
double l, r;
bool operator <(const inter&rhs)const {
return l < rhs.l;
}
} p[N];
int main() {
int T = 0;
while(1) {
read(n);
read(d);
if(!n & !d) break;
cout << "Case " << ++T << ": ";
bool flag(0);
rep(i, 1, n) {
read(x);
read(y);
if(y > d) {
flag= 1;
break;
}
double c = sqrt(1.0 * d * d - 1.0 * y * y);
p[i].l = x - c;
p[i].r = x + c;
}
if(flag) {
out(-1, '
');
continue;
}
std::sort(p + 1, p + n + 1);
int num(0);
double last = -1e18;
rep(i, 1, n) {
if(p[i].l > last) {
last = p[i].r;
++num;
} else {
last = min(last, p[i].r);
}
}
out(num, '
');
}
return 0;
}