码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1328Radar Installation

时间:2015-02-22 12:16:26      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

//贪心题,所谓贪心只是一个思想,没有特定的解法,只是单纯地找出当前最多的解,能多就多,最后企图达到整体的最优,这就是贪心。

//这道题是说有一个x轴作为海岸分界线,上方是海,有一个个的海岛,下方是陆地,有一个雷达,扫描范围是半径为d的圆,只能安装在x轴上,问最少要安装多少个雷达?

//如图技术分享首先是只要明确A和B点有什么意义,这道题就能很快解答,以A和B点做圆心,d为半径就刚好交C点,所以A到B是一个区间范围,在[A,B]上建圆就可以把C给概括起来(易证),然后整道题目就变成了区间包围问题;把每个点的这两个左右点都算出来,按左点进行排序,然后更新左右区间,见代码(l和r),只要两个区间有公共范围,就可以用一个雷达把他们都罩起来;

 

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct point{
 8     double left;
 9     double right;
10 }p[1010];
11 
12 bool cmp(point a, point b){
13     return (a.left < b.left);
14 }
15 
16 int main()
17 {
18     int n, d, res, tcase = 0;
19     while(cin >> n >> d && (n || d)){
20         bool flag = false;
21         for(int i = 0; i < n; i++){
22             double x, y;
23             scanf("%lf%lf", &x, &y);
24             if(y > d)
25                 flag = true;
26             else{
27                 p[i].left = x-sqrt(d*d-y*y);
28                 p[i].right = x+sqrt(d*d-y*y);
29             }
30         }
31         printf("Case %d: ", ++tcase);
32         if(flag)
33             printf("-1\n");
34         else{
35             sort(p,p+n,cmp);
36             res = 1;
37             double l = p[0].left, r = p[0].right;
38             for(int i = 1; i < n; i++){
39                 if(r < p[i].left){
40                     res++;
41                     r = p[i].right;
42                 }
43                 else if(r > p[i].right)
44                     r = p[i].right;
45                 l = p[i].left;
46             }
47             printf("%d\n", res);
48         }
49     }
50     return 0;
51 }
View Code

 

poj 1328Radar Installation

标签:

原文地址:http://www.cnblogs.com/zhenhao1/p/4297370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!