题目链接:http://poj.org/problem?id=1328
题意:地图的x轴的上方为海,下方为陆地,海中有n个小岛,坐标为(node[i].x,node[i].y)。有一种雷达,能探测到的范围为以d为半径的圆。问海岸线上至少造多少雷达可以把所有的小岛都包含在内。注意雷达是建在海岸线上的,也就是x轴上的。
思路:贪心。从左到右建立雷达,要尽量多地覆盖岛屿。以岛屿为圆心,以d为半径画圆,如果画出的圆与x轴没有交点,则不能实现。若存在交点,计算出第i个岛屿与x轴的交点坐标保存在结构体数组rad[i].sta与rad[i].end中。对结构体数组排序,按照rad[i].end进行升序排列,然后一次从左到右找雷达。对于rad[a].end,给第a个岛屿建立一个雷达,如果下一个岛屿rad[i].sta<rad[a].end,则不需要建立新的雷达,i++,考虑下一个雷达,否则需要建立新的雷达,更新a值,a=i。直到所有岛屿都考虑完。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct no{
int x,y;
}node[1003];
struct ra{
double sta,en;
}rad[1003];
bool cmp(ra a,ra b){
if(a.en!=b.en)
return a.en<b.en;
return a.sta<b.sta;
}
int main ()
{
int t=0,n,d;
int maxx;
while(cin>>n>>d){
if(n==0&&d==0) break;
t++;
maxx=0;
for(int i=0;i<n;i++){
cin>>node[i].x>>node[i].y;
if(node[i].y>maxx)
maxx=node[i].y;
if(node[i].y<0)
d=0;
}
cout<<"Case "<<t<<": ";
if(maxx>d||d<=0) cout<<"-1"<<endl;
else{
for(int i=0;i<n;i++){
rad[i].sta=node[i].x-sqrt(d*d-node[i].y*node[i].y);
rad[i].en=node[i].x+sqrt(d*d-node[i].y*node[i].y);
}
sort(rad,rad+n,cmp);
int a=0,ans=1;
for(int i=1;i<n;i++){
if(rad[i].sta>rad[a].en){
ans++;
a=i;
}
}
cout<<ans<<endl;
}
}
}