poj 1328 Radar Installation(贪心)

 

 

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

 

 

 

题意:建立一个平面坐标,x轴上方是海洋,x轴下方是陆地。在海上有n个小岛,每个小岛看做一个点。然后在x轴上有雷达,雷达能覆盖的范围为d,问至少需要多少个雷达能监测到多有的小岛。

 

思路:从左到右把每个小岛的放置雷达的区间求出,按结束点排序,从左至右看,当发现下一个区间的起始点大于前面所有区间的最小结束点的时候,答案加一。

 

 1 #include <stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<math.h>
 5 
 6 using namespace std;
 7 struct node
 8 {
 9    double a,b;
10 }area[1005];
11 
12 int cmp(const void *a,const void *b)
13 {
14     return (*(node *)a).b>(*(node *)b).b?1:-1;
15 }
16 
17 int main()
18 {
19     int n,i,sum,f,h=1;
20     double x,y,d,e;
21     while(~scanf("%d%lf",&n,&d)&&(n!=0||d!=0))
22     {
23          f=0;   sum=1;
24         for(i=0; i<n; i++)
25         {
26             scanf("%lf%lf",&x,&y);
27             area[i].a=x-sqrt(d*d-y*y);
28             area[i].b=x+sqrt(d*d-y*y);
29             if(y<0)
30             y=-y;
31             if(y>d)
32             f=1;
33         }
34 
35         if(f)
36         printf("Case %d: -1\n",h);
37 
38         else
39         {
40             qsort(area,n,sizeof(area[0]),cmp);
41             e=area[0].b;
42             for(i=1; i<n; i++)
43             {
44                 if(area[i].a>e)
45                 {
46                     sum++;
47                     e=area[i].b;
48                 }
49             }
50             printf("Case %d: %d\n",h,sum);
51         }
52         h++;
53     }
54     return 0;
55 }

 

 

 

posted @ 2013-06-21 20:06  水门  阅读(129)  评论(0编辑  收藏  举报