题目大意:海中有n个岛屿,现在想要在海岸线上装设雷达来探测这些岛屿(海岸线相当于x轴,岛屿都在x轴的上方),雷达的探测范围是一个半径为d的圆,已知n个岛屿的坐标,问你最少需要多少雷达才能探测到全部岛屿;如果不能探测到全部岛屿,输出“ -1 ”。
分析:
显而易见,如果输入的岛屿的y坐标存在大于雷达探测范围的值,那么我们就可以直接判断出不可能探测到所有岛屿了(因为雷达始终在海岸线上)。
至于能探测到所有岛屿的情况呢,我们知道,每给出的每一个岛屿的坐标,我们都可以再海岸线上找到这么两个雷达,分别使该岛屿恰好在这两个雷达的探测范围的左边缘和右边缘,我们记录下这两个边缘值作为在海岸线上可以探测到该岛屿的区间值,这样n个岛屿的坐标确定之后,我们也就确定出了n个区间值来探测这些岛屿了,接下来我们要做的就是筛选出有效的区间值,也就是最少的雷达数目。
实现代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
typedef struct node
{
double left,right;
}interval;
interval ans[1010];
int cmp(const interval &a,const interval &b)
{
return a.left<b.left;
}
int main()
{
int n,x,y;
double d;
bool flag;
int T=1;
while(scanf("%d%lf",&n,&d))
{
if(n==0&&d==0) break;
flag=true;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
if(y>d) flag=false;
ans[i].left=x*1.0-sqrt(d*d-y*y);
ans[i].right=x*1.0+sqrt(d*d-y*y);
}
printf("Case %d: ",T++);
if(!flag) puts("-1");
else
{
sort(ans,ans+n,cmp);
int cnt=1;
interval tmp=ans[0];
for(int i=1;i<n;i++)
if(ans[i].left>tmp.right)
{
cnt++;
tmp=ans[i];
}
else if(ans[i].right<tmp.right)
tmp=ans[i];
printf("%d\n",cnt);
}
}
return 0;
}