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;
}

 

posted @ 2010-08-18 21:14  勇泽  阅读(206)  评论(0编辑  收藏  举报