题目链接:传送门
思路:找最少有几个点,先求出每个点的覆盖范围,就是一个点最大可以到达的地方是y相同的地方而且直线距离是d,
所以x范围在[x-sqrt(d*d-y*y),x+sqrt(d*d-y*y)]内均符合条件;如果有相交的地方就是可以忽略这个点。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = ;
struct Node{
double l,r;
int x,y;
};
bool cmp(Node a,Node b)
{
return a.r<b.r;
}
Node vc[maxn];
int main(void)
{
int i,j,cnt,n,d,fg,x,y,pt=;
while(scanf("%d%d",&n,&d)&&(n+d))
{
for(fg=,i=;i<n;i++)
{
scanf("%d%d",&vc[i].x,&vc[i].y);
if(vc[i].y>d) fg=;
}
if(fg==)
{
printf("Case %d: -1\n",pt++);
continue;
}
for(i=;i<n;i++)
{
vc[i].l=vc[i].x-sqrt(d*d*1.0-vc[i].y*vc[i].y*1.0);
vc[i].r=vc[i].x+sqrt(d*d*1.0-vc[i].y*vc[i].y*1.0);
}
sort(vc,vc+n,cmp);
for(i=,cnt=;i<n;)
{
double tp=vc[i].r;
while(tp>=vc[i].l&&tp<=vc[i].r) i++;
cnt++;
}
printf("Case %d: %d\n",pt++,cnt);
}
return ;
}