【E】雷达的设置

来源:互联网 发布:马拉多纳 数据 编辑:程序博客网 时间:2024/04/26 14:41

Description

为保卫我国领土,海岸线上要安装一些雷达监控岛屿。假设海岸线可视为一条直线,一边为大海,一边为大陆,岛屿可看作一个点,雷达监控的范围为一个半径为d的圆。为了方便表示,我们使用笛卡尔坐标系,令海岸线为X轴,X轴上方为大海,X轴下方为大陆,所有岛屿的位置都是由坐标给出。

Input

有多组测试数据,第一行给出岛屿的数目n(1<=n<=1000)和雷达监控范围d,接下来n行输入第i个岛屿的X坐标和Y坐标,当n和d都是零时结束。    

Output

每组测试数据输出一行,要包括样例的编号,如果无法覆盖所有岛屿,输出-1。

Sample Input

2 5
-3 4
-6 3

4 5
-5 3
-3 5
2 3
3 3

0 0

Sample Output

Case 1: 1
Case 2: 2

答案:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct Node
{
int x;
int y;
}node[2000];
bool cmp(Node a,Node b)
{
return a.x<=b.x;
}
double Min(double x,double y)
{
return x-y>0?y:x;
}
int main()
{
int n=0,d=0,t=0;
int i,ans;
double ix1,ix2;
double k;
while(scanf("%d%d",&n,&d)!=EOF)
{
ans=1;
t++;
if(n==0&&d==0)
break;
for(i=0;i<n;i++)
{
scanf("%d%d",&node[i].x,&node[i].y);
if(abs(node[i].y)>d)
ans = -1;
}
printf("Case %d: ",t);
if(ans==-1)
{
printf("-1\n");
continue;
}
sort(node,node+n,cmp);
ix1 = node[0].x-sqrt(0.0+d*d-node[0].y*node[0].y);
ix2 = node[0].x+sqrt(0.0+d*d-node[0].y*node[0].y);
for(i=1;i<n;i++)
{
k = sqrt(0.0+d*d-node[i].y*node[i].y);
if(node[i].x - k <= ix2)
{
ix1 = node[i].x - k;
ix2 = Min(k+node[i].x,ix2);
}
else
{
ix1 = node[i].x-sqrt(0.0+d*d-node[i].y*node[i].y);
ix2 = node[i].x+sqrt(0.0+d*d-node[i].y*node[i].y);
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}