题目链接
对于每个区间,优先选择已有的监控设备管辖它
如果当前区间左端点大于最后一台监控设备右端点,新增一台设备,否则更新最后一台监控的位置
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
const int N=1e3+10;
int n;
double d;
struct node{
double l,r;
bool operator <(const node&rhs)const{
return l<rhs.l;}
}p[N];
int main()
{
//freopen("in.txt","r",stdin);
int ca=0;
double x,y;
while(scanf("%d%lf",&n,&d)&&n)
{
int cnt=1;
node tmp;
bool flag=false;
printf("Case %d: ",++ca);
_rep(i,1,n)
{
scanf("%lf%lf",&x,&y);
if(fabs(y)>d)flag=true;
else p[i].l=x-sqrt(d*d-y*y),p[i].r=x+sqrt(d*d-y*y);
}
if(flag){puts("-1");continue;}
sort(p+1,p+n+1);
tmp=p[1];
_rep(i,2,n)
{
if(p[i].l>tmp.r)cnt++,tmp=p[i];
else if(p[i].r<tmp.r)tmp=p[i];
}
printf("%d\n",cnt);
}
return 0;
}