题目描述
一共有 nnn 个小岛位于 xxx 轴之上, xxx 轴为海岸, xxx 轴上方为海洋。现需要在海岸上建立雷达。
在海岸建立的最少的雷达数目,使得雷达可以覆盖所有的小岛。可以认为每个小岛都是一 个点。
如图所示,三个小岛分别是 P1,P2,P3P_1, P_2, P_3P1,P2,P3, 雷达的半径 d=2,d=2,d=2, 在 xxx 轴上建立两个雷达 (−2,0)(-2,0)(−2,0) 和 (1,0)(1,0)(1,0) 就能覆盖三个小岛。
输入
输入包含若干组数据,每组数据的第一行是两个整数 nnn 和 ddd (1⩽n⩽10001 \leqslant n \leqslant 10001⩽n⩽1000),分别表示小岛的个数和雷达的半径。接下来有 nnn 行,每行的两个整数分别表示各个小岛的坐标。输入以 0 0
结束。
输出
对于每组数据输出一行,为最少的雷达数。如果该组数据无解,则输出 −1-1−1。
输入输出样例
样例输入 #1
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
样例输出 #1
Case 1:2
Case 2:1
代码部分
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,d;
struct sbtz
{
int x,y;
float x1,x2;
};
bool tzsb(sbtz a,sbtz b)
{
return a.x1<b.x1;
}
int main()
{
int m=0;
while(1)
{
m++;
cin>>n>>d;
if(n==0&&d==0)
break;
sbtz l[1005];
bool t=0;
for(int i=0;i<n;i++)
{
cin>>l[i].x>>l[i].y;
if(l[i].y>d)
t=1;
l[i].x1=l[i].x-(d*d-l[i].y*l[i].y);
l[i].x2=l[i].x+(d*d-l[i].y*l[i].y);
}
if(t)
{
cout<<"Case "<<m<<":-1"<<endl;
continue;
}
sort(l,l+n,tzsb);
float Min=l[0].x2;
int ans=1;
for(int i=1;i<n;i++)
{
if(l[i].x1>Min)
{
ans++;
Min=l[i].x2;
}
else
{
Min=min(Min,l[i].x2);
}
}
cout<<"Case "<<m<<":"<<ans<<endl;
}
return 0;
}