把每个点的放置雷达的区间求出,然后按照区间排序。
排好序后,从左至右看,当发现下一个区间的起始点大于前面所有区间的最小结束点的时候,答案加一。
排好序后,从左至右看,当发现下一个区间的起始点大于前面所有区间的最小结束点的时候,答案加一。
忽视前面走过的所有点后,对后面进行相同的操作(从左至右看,当发现下一个区间的起始点大于左边未被忽视的所有区间的最小结束点的时候,答案加一)。
直到结束.
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define N 1005
struct point {int x,y;};
bool cmp(point a, point b) { return a.x<b.x; }
int main()
{
int t=0;
while (true)
{
bool flag=false; int n,d; point a[N];
scanf("%d%d",&n,&d);
if (n==0 && d==0)
break;
for (int i=0; i!=n; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
if (a[i].y>d) flag=true;
}
if (flag)
{
printf("Case %d: %d\n",++t,-1);
continue;
}
sort(a,a+n,cmp);
double left[N],right[N];
for (int i=0; i!=n; i++)
{
left[i]=a[i].x-sqrt(double(d*d-a[i].y*a[i].y));
right[i]=a[i].x+sqrt(double(d*d-a[i].y*a[i].y));
}
int ans=1; double temp=right[0];
for (int i=0; i!=n-1; i++)
if (left[i+1]>temp)
{
temp=right[i+1]; ans++;
}
else
if (right[i+1]<temp)
temp=right[i+1];
printf("Case %d: %d\n",++t,ans);
}
return 0;
}