题目链接:http://poj.org/problem?id=1328
题目大意:在直角坐标系中,y轴正方向上有n个岛屿,现有检测半径为r的雷达要求建在x轴上,求最少要几个雷达覆盖所有的岛。
贪心:先求出每个岛在x轴上的投影区间,按照区间排序再用贪心。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct Island
{
int x,y;
}island[1005];
int cmp(Island a,Island b)
{
return a.x<b.x;
}
int main()
{
int num,rad;
int cas=1;
for(;;)
{
scanf("%d%d",&num,&rad);
if(!(num&&rad))
break;
int i;
bool flag=false;
for(i=0;i<num;i++)
{
scanf("%d%d",&island[i].x,&island[i].y);
if(island[i].y>rad)
flag=true;
}
if(flag)
printf("Case %d: -1\n",cas++);
else
{
sort(island,island+num,cmp);
double a[1005],b[1005];
for(i=0;i<num;i++)
{
a[i]=island[i].x-sqrt(double(rad*rad-island[i].y*island[i].y));
b[i]=island[i].x+sqrt(double(rad*rad-island[i].y*island[i].y));
}
double temp=b[0];
int ans=1;
for(i=1;i<num;i++)
{
if(a[i]>temp)
{
temp=b[i];
ans++;
}
else if(b[i]<temp)
temp=b[i];
}
printf("Case %d: %d\n",cas++,ans);
}
}
return 0;
}