POJ 1328 Radar Installation

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

//第一次:从左边第一个未被覆盖的island开始 -->>失败 因为还有y坐标这一因素 不能保证贪心
//第二次:找两个点 确定一个圆 ----->>>其实早就应该发现错误 漏洞百出 不具有普遍性
//从左边第一个未覆盖的点作为基点 找到第一个 y坐标>=的点(如果没有找到) 做这两个点的公共圆
//如果不能做这两个点的公共圆 或者 没有y>=的点 那么做这个圆的右极限圆
//更新覆盖的点
//蠢-->>

//最终策略:把注意力全部集中在x轴上 , 对每个island 作为圆心 交在x轴上有一个区间 那么radar在这个区间内都可以覆盖这个岛屿
//所以讲所有岛屿的左区间进行排序 区间重叠的共用一个radar
//思路一错 全盘否定

网上题解盗一张图说明

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdio.h>
 4 #include <algorithm>
 5 #include <math.h>
 6 using namespace std;
 7 
 8 struct Island
 9 {
10     int x,y;
11     double limit_l, limit_r;
12     bool cover;
13     bool operator < (Island a) const
14     {
15         return limit_l < a.limit_l;//按左区间排序
16     }
17 }island[1024];
18 int N, d;
19 
20 int solve()
21 {
22     double limit_l, limit_r;
23     int cnt = 1;
24     if (!N) return 0;//如果N==0
25     for (int i = 0; i < N; i++)
26     {
27         island[i].limit_l = island[i].x - sqrt( d*d - island[i].y*island[i].y );
28         island[i].limit_r = island[i].x + sqrt( d*d - island[i].y*island[i].y );
29     }
30     sort(island, island+N);//按照左区间排序
31     limit_l = island[0].limit_l;//这里最后忘了初始化 然后挂了
32     limit_r = island[0].limit_r;
33     for(int  i = 1; i < N; i++)
34     {
35         //cnt++;//第一个雷达
36         if (island[i].limit_l > limit_r)
37         {
38             cnt++;
39             limit_l = island[i].limit_l;
40             limit_r = island[i].limit_r;
41         }
42         else if (island[i].limit_r < limit_r)
43         {
44             limit_r = island[i].limit_risland[i].x - sqrt( d*d island[i].y*island[i].y );
45         }
46     }
47     return cnt;
48 }
49 int main()
50 {
51     freopen("in.txt", "r", stdin);
52     bool fail = false;
53     int Case = 0;
54     while (~scanf("%d%d",&N, &d))
55     {
56         if (N == 0 && d == 0) break;
57         getchar();//空行
58         fail = false;//失败的标志
59         Case++;
60         for (int i = 0;i < N; i++)
61         {
62             scanf("%d%d", &island[i].x, &island[i].y);
63             if ( island[i].y > d || island[i].y < 0)
64             {
65                 fail = true;
66             }
67         }
68         if (fail) printf("Case %d: %d\n",Case, -1);
69         else   printf("Case %d: %d\n", Case, solve());
70     }
71     return 0;
72 }
View Code

 

posted @ 2017-01-19 22:42  Lorazepam  阅读(175)  评论(0编辑  收藏  举报