Problem : Radar Installation
Description:把海岸线看成一条笔直的直线,当做x轴,x轴的上方是海域,下方是陆地;海域中有一些小岛,现在希望在海岸线上建立一些雷达,使得这些小岛都能被监测到,问最少需要多少雷达?小岛的位置由坐标给出。
Solution:贪心问题,以小岛的位置为圆心,雷达监测的距离为半径作圆,得到与x轴的两个交点,以右交点从小到大排序,当下一个的左交点大于前一个需要装雷达的小岛的右交点时,雷达个数加1。
Code(C++):
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 1005
using namespace std;
double x[N],y[N];
struct radar
{
double left;
double right;
} r[N];
bool cmp(struct radar a,struct radar b)
{
return a.right<b.right;
}
int main()
{
double m;
int n,i,j,count,k=0;
int flag;
while(cin>>n>>m,n+m!=0)
{
flag=1;
j=0;
count=1;
for(i=0; i<n; i++)
cin>>x[i]>>y[i];
for(i=0; i<n&&flag==1; i++)
{
if(y[i]>m)
{
flag=0;
count=-1;
break;
}
double tmp=sqrt(m*m-y[i]*y[i]);
r[i].left=x[i]-tmp;
r[i].right=x[i]+tmp;
}
sort(r,r+n,cmp);
for(i=1; i<n&&flag==1; i++)
{
if(r[i].left>r[j].right)
{
j=i;
count++;
}
}
cout<<"Case "<<++k<<": "<<count<<endl;
}
return 0;
}