Radar Installation--POJ 1328
1、题目类型:贪心算法。
2、解题思路:(1)将所有的岛转换为对海岸线上雷达位置的区间;(2)对所有岛的区间按照其right进行排序;(3)遍历搜索需要增加的雷达数。
3、注意事项:遍历中一旦发现重叠既用flag[]标示;当y>d时,输出-1。
4、实现方法:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
#define Max 1010
struct TRange{
double left,right;
};
TRange range[Max];
bool flag[Max],mark;
int cmp(const TRange &n1,const TRange &n2)
{
if(n1.right!=n2.right)
return n1.right<n2.right;
else
return n1.left<n2.left;
}
int main()
{
int i,j,n,d,cnt,num=0;
double x,y,tmp;
while((cin>>n>>d) && (n||d))
{
num++;
mark=false;
memset(range,0,sizeof(range));
memset(flag,0,sizeof(flag));
for(i=0;i<n;i++)
{
cin>>x>>y;
if(y>d)
{
mark=true;
}
tmp=sqrt(pow((double)d,2)-pow((double)y,2));
range[i].left=x-tmp;
range[i].right=x+tmp;
}
sort(range,range+n,cmp);
cnt=-1;
if(!mark)
{
cnt++;
for(i=0;i<n;i++)
{
if(flag[i])
continue;
cnt++;
flag[i]=true;
for(j=i+1;j<n;j++)
{
if(range[i].right>=range[j].left)
{
flag[j]=true;
}
else
{
break;
}
}
}
}
cout<<"Case "<<num<<": "<<cnt<<endl;
}
return 0;
}