如今我们位于沿海地区,需要安装大炮,使得火力可以覆盖整个区域。海岸线可以视为是无限长的直线。陆地位于海岸线的一侧,海洋位于另一侧。海洋里有若干个岛屿,每个小岛可以视为海洋中的一个点。我们需要在海岸线上安装大炮,每个大炮智能覆盖距离d,因此海洋中的小岛被大炮安装所覆盖的条件是两者间的距离不超过 d 。 我们将海岸线视为 x 轴。海洋的一侧位于 x 轴上方,陆地的一侧位于下方。给定海洋中每个小岛的位置(以xy坐标给出),并给定大炮的覆盖距离,你需要写程序,找出安装大炮的最少数量,使得所有的小岛都被覆盖。
Input
输入由多个测试用例组成。每个测试用例的第一行,包含了两个整数 n (1<=n<=1000) 和 d,其中 n 是海洋中小岛的数目,d 是大炮可以覆盖的距离。接下来是 n 行,每行包含了两个整数,表示每个小岛的坐标。每组测试用例之间,以一个空行间隔。
输入终止于包含两个 0 的一行。
Output
对于每个测试用例,输出一行,包括测试用例的编号,以及安装大炮所需的最小数量。如果不能全部覆盖,则输出"-1"。
Sample Input
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
Case 1: 2
Case 2: 1
解题报告:
这道题太看细节了,,debug了一个小时,1是d和y可能是相反数,所以不能t=dd-yy t<0来判断d是不是真的小于y 2:我们以左端点排序,如果当前的最远的距离比枚举的左端点大的时候,如果它超出了右端点,那么就应该用右端点的值,不然就不能覆盖这一次的雷达了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
const int N=1010;
struct node{
double l;
double r;
}q[N];
bool cmp(node a,node b)
{
return a.l<=b.l;
}
int main()
{
int kk=0;
int n;
double d;
while(cin>>n>>d&&n&&d)
{
bool flag=true;
for(int i=0;i<n;i++)
{
double x,y;
cin>>x>>y;
double t=d*d-y*y;
if(d<y)
{
flag=false;
continue;
}
else
{
q[i].l=x-sqrt(t);
q[i].r=x+sqrt(t);
}
}
int cntt;
if(flag)
{
sort(q,q+n,cmp);
double last=q[0].r;
cntt=1;
for(int i=1;i<n;i++)
{
if(q[i].l>last)
{
cntt++;
last=q[i].r;
}
else if(q[i].r<last)
last=q[i].r;
}
cout<<"Case "<<++kk<<": "<<cntt<<endl;
}
else
cout<<"Case "<<++kk<<": "<<"-1"<<endl;
}
return 0;
}