题目地址:http://poj.org/problem?id=1328
题目大意:
题意:多组数据输入,每组数据第一行给出N,R接着有N组小岛坐标,雷达半径为R。X轴以上是海洋,X轴以下是陆地,雷达只能部署到X轴上,输出覆盖海洋上N个小岛最少需要多少雷达,如果不能完全覆盖,输出-1;
思路:假设雷达在小岛上,那么雷达覆盖范围和X轴就有相交区间,记录下这个区间的左右极限,接着就是区间覆盖问题,有重叠区间的部分只要一个雷达就够了,如果发现有雷达覆盖范围不和X轴相交,那就输出-1
源代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 1005;
struct pos//记录小岛雷达站覆盖的区间
{
double left,right;
} p[maxn];
bool cmp(pos a, pos b)
{
if(a.right==b.right)
return a.left < b.left;
return a.right <b.right;
}
int main()
{
int n,d;int Case = 1;
while(~scanf("%d %d",&n,&d))
{
if(n==0&&d==0)
break;
int flag = 0;
for(int i = 0 ; i < n; i++)
{
int px,py;
scanf("%d %d",&px,&py);
if(py>d)
{
flag = 1;
}
p[i].left = px - sqrt(d*d-py*py);
p[i].right = px + sqrt(d*d-py*py);
}
if(flag == 1)
{
printf("Case %d: -1\n",Case++);
continue;
}
sort(p,p+n,cmp);
int result = 1;
double rt = p[0].right;
for(int i = 0 ; i < n; i ++)
{
if(p[i].left>rt)
{
result++;
rt = p[i].right;
}
}
printf("Case %d: %d\n",Case++,result);
}
return 0;
}
提供测试数据: