poj1328 Radar Installation

我们一眼就看出了这是一个贪心,只要排序即可。

具体来说:按照x排序,然后尽量靠右放探测器。

实际上我们还要用到一个转化:把一个点转化为x轴上的一段区间。

然后我就成功WA了!

然后发现少了一个关键语句:else if(a[i].r < now) now = a[i].r;

之前的贪心策略是错误的。这样搞之后才是正确的贪心。

(学习了使用pair)

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 1010;
 6 const double eps = 1e-10;
 7 int d;
 8 pair<int, int>island[N];// [x, y]
 9 pair<double, double>a[N];//[l, r]
10 inline void cal(int x, int y, double& l, double& r) {
11     double len = sqrt((double)(d * d - y * y));
12     l = x - len;
13     r = x + len;
14     return;
15 }
16 int T;
17 int main() {
18     //freopen("in.in", "r", stdin);
19     //freopen("my.out", "w", stdout);
20     int n;
21     scanf("%d%d", &n, &d);
22     while(d || n) {
23         bool boom = 0;
24         for(int i = 1; i <= n; i++) {
25             scanf("%d%d", &island[i].first, &island[i].second);
26             if(island[i].second > d) {
27                 boom = 1;
28             }
29             cal(island[i].first, island[i].second, a[i].first, a[i].second);
30         }
31         if(boom) {
32             T++;
33             printf("Case %d: -1\n", T);
34             scanf("%d%d", &n, &d);
35             continue;
36         }
37         sort(a + 1, a + n + 1);
38         double now = -0x3f3f3f3f;
39         int ans = 0;
40         for(int i = 1; i <= n; i++) {
41             if(a[i].first - now > eps) {
42                 ans++;
43                 now = a[i].second;
44             }
45             else if(now - a[i].second > eps) {
46                 now = a[i].second;
47             }
48         }
49         T++;
50         printf("Case %d: %d\n", T, ans);
51         scanf("%d%d", &n, &d);
52     }
53     return 0;
54 }
AC代码

 

posted @ 2018-05-09 15:58  huyufeifei  阅读(106)  评论(0编辑  收藏  举报
试着放一个广告栏(虽然没有一分钱广告费)

ReadEra 阅读书籍

『Flyable Heart 応援中!』 HHG 高苗京铃 闪十PSS 双六 電動伝奇堂 章鱼罐头制作组 はきか 祝姬 星降夜