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

 

你可能感兴趣的:(Install)