这道题是个简单的贪心就可解决的初级题目。

题目源地址:http://poj.org/problem?id=1328

算法:先对输入的各点做处理,选定各点需要雷达位置的范围[x-sqrt(d^2-y^2),   x+sqrt(d^2-y^2)],然后对所有范围的下界从小到大排序,这样可以通过各范围的上界来找出重叠的范围,所又重叠的区域都可以用一个雷达来囊括所有的小岛。代码没什么难度。

要注意的就是对于输入的雷达探测半径如果小于0,或者小岛的位置在陆地上(Y<0),都要特殊判断。

下面是代码:

 1 #include<cstdio>
2 #include<algorithm>
3 #include<cstring>
4 #include<queue>
5 #include<math.h>
6 using namespace std;
7 #define maxn 1002
8
9 struct Locat{
10 int x, y;
11 }loc[maxn];
12
13 struct Locat2{
14 double l, r;
15 }set[maxn];
16
17 void set_rader(int i, int d, struct Locat loc){
18 double t;
19 t = sqrt(((double)d*d - (double)loc.y*loc.y));
20 set[i].l = loc.x - t; set[i].r = loc.x + t;
21 }
22
23 bool comp(const Locat2 &A, const Locat2 &B){
24 return A.r < B.r;
25 }
26
27 int main(){
28 int n, d;
29 int i, left, right, ans, num=1, flag;
30 while(scanf("%d %d",&n, &d) && n){
31 left = 0;
32 ans = 0;
33 flag = 1;
34 if(d<0) flag = 0;
35 for(i=0; i<n; i++){
36 scanf("%d %d", &loc[i].x, &loc[i].y);
37 set_rader(i, d, loc[i]);
38 if(loc[i].y < 0 || loc[i].y > d) flag = 0;
39 }
40 if(flag == 0)
41 printf("Case %d: -1\n",num++);
42 else{
43 sort(set, set+n, comp);
44 for(right=1; right<n; right++){
45 double temp = set[left].r;
46 if(set[right].l > temp){
47 ans++;
48 left = right;
49 }
50 }
51 printf("Case %d: %d\n",num++, ans+1);
52 }
53 }
54 return 0;
55 }



posted on 2012-04-06 21:11    阅读(182)  评论(0编辑  收藏  举报