一、题目内容
POJ 1328 原题地址
二、题意解释
假设海岸线是一条无限延伸的直线。陆地在海岸线的一侧,而海洋在另一侧。每一个小的岛屿是海洋上的一个点。
雷达坐落于海岸线上,只能覆盖d距离,所以如果小岛能够被覆盖到的话,它们之间的距离最多为d。
题目要求计算出能够覆盖给出的所有岛屿的最少雷达数目。
三、代码及注释
#include<iostream>
#include<math.h>
#include<algorithm>
#define INF 0x7ffffff
using namespace std
;
const int Max
= 1005;
struct
{
int x
, y
;
} isl
[Max
];
struct data
{
float sta
, end
;
} rad
[Max
];
bool cmp(data a
, data b
)
{
if(a
.end
< b
.end
)
return true;
else
return false;
}
int main()
{
int n
, d
, t
= 1;
while(cin
>> n
>> d
&& n
!= 0)
{
int i
, j
, max_y
= 0;
for(i
= 0; i
< n
; i
++)
{
cin
>> isl
[i
].x
>> isl
[i
].y
;
if(isl
[i
].y
> max_y
)
max_y
= isl
[i
].y
;
}
getchar();
getchar();
cout
<< "Case " << t
++ << ": ";
if(max_y
> d
|| d
< 0)
{
cout
<< -1 << endl
;
continue;
}
float len
;
for(i
= 0; i
< n
; i
++)
{
len
= sqrt(1.0 * d
* d
- isl
[i
].y
* isl
[i
].y
);
rad
[i
].sta
= isl
[i
].x
- len
;
rad
[i
].end
= isl
[i
].x
+ len
;
}
sort(rad
, rad
+ n
, cmp
);
int ans
= 0;
float pos
=-INF
;
for(int i
=0;i
<n
;i
++){
if(pos
<rad
[i
].sta
){
pos
=rad
[i
].end
;
ans
++;
}
}
cout
<< ans
<< endl
;
}
return 0;
}
转载请注明原文地址:https://blackberry.8miu.com/read-103.html