您的位置:首页 > 其它

Radar Installation--POJ 1328

2010-08-18 21:14 134 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: