• poj1328 Radar Installation


    思路:

    关于区间的贪心问题。首先排除 d<=0 或者 某个岛屿的纵坐标大于d的情况。之后以每个island为圆心,d为半径画圆,与x轴产生两个交点,这两个交点构成一个区间。在这个区间内任意位置放置雷达都能覆盖到这个island。对所有这样的区间排序后,从左到右扫描,维护目前放置雷达的位置now_right,设下一个区间的靠左的x坐标为left,靠右的x坐标为right。如果left > now_right,即两个区间没有交集,则在right重新放置一个雷达,并且now_right = right;如果left <= now_right 并且 right <= now_right,相当于下一个区间被包含到当前区间,此时无需重新放置雷达,只要令now_right = right即可,相当于把now_right部位放置的雷达“挪”回到right位置,同时满足了两个区间的需求;如果left <= now_right 并且 right > now_right,则此时now_right放置的雷达就能满足两个区间的要求,同样无需重新放置雷达。

    实现:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 struct node
     8 {
     9     double x, y;
    10 };
    11 node a[1005];
    12 int n, d;
    13 pair<double, double> p[1005];
    14 
    15 int main()
    16 {
    17     int T = 1;
    18     while (cin >> n >> d, n || d)
    19     {
    20         bool flag = true;
    21         if (d <= 0)
    22             flag = false;
    23         for (int i = 0; i < n; i++)
    24         {
    25             cin >> a[i].x >> a[i].y;
    26             if (a[i].y > d)
    27                 flag = false;
    28         }
    29         if (!flag)
    30         {
    31             cout << "Case " << T++ << ": -1" << endl;
    32             continue;
    33         }
    34         for (int i = 0; i < n; i++)
    35         {
    36             p[i].first = a[i].x - sqrt(d * d - a[i].y * a[i].y);
    37             p[i].second = a[i].x + sqrt(d * d -a[i].y * a[i].y);
    38         }
    39         sort(p, p + n);
    40         int cnt = 1;
    41         double now_right = p[0].second;
    42         for (int i = 1; i < n; i++)
    43         {
    44             if (p[i].first > now_right)
    45             {
    46                 cnt++;
    47                 now_right = p[i].second;
    48             }
    49             else if (p[i].second <= now_right)
    50             {
    51                 now_right = p[i].second;
    52             }
    53         }
    54         cout << "Case " << T++ << ": " << cnt << endl;
    55     }
    56     return 0;
    57 }
     1 #include <iostream>
     2 #include <cmath>
     3 #include <algorithm>
     4 using namespace std;
     5 const int MAXN = 1005;
     6 pair<double, double> p[MAXN];
     7 int square(int x)
     8 {
     9     return x * x;
    10 }
    11 bool comp(const pair<double, double> & a, const pair<double, double> & b)
    12 {
    13     if (a.second != b.second) return a.second < b.second;
    14     return a.first < b.first; 
    15 }
    16 int main()
    17 {
    18     int n, d, Kase = 1;
    19     while (cin >> n >> d, n || d)
    20     {
    21         bool flg = true;
    22         for (int i = 0; i < n; i++)
    23         {
    24             cin >> p[i].first >> p[i].second;
    25             if (p[i].second > d) flg = false;
    26             double tmp = sqrt(square(d) - square(p[i].second));
    27             double l = p[i].first - tmp, r = p[i].first + tmp;
    28             p[i].first = l; p[i].second = r;
    29         }
    30         if (!flg) { cout << "Case " << Kase++ << ": -1" << endl; continue; }
    31         sort(p, p + n, comp);
    32         int ans = 1, i = 1;
    33         double now = p[0].second;
    34         while (i < n)
    35         {
    36             if (p[i].first > now) { ans++; now = p[i].second; }
    37             i++;
    38         }
    39         cout << "Case " << Kase++ << ": " << ans << endl;
    40     }    
    41     return 0;
    42 }
  • 相关阅读:
    (数字类型,进制转换,字符串,列表)介绍,操作,内置方法
    谁说JavaScript容易?
    sass/scss 和 less的区别
    为什么commonjs不适合于浏览器端
    nodejs与v8引擎
    单例模式和angular的services的使用方法
    深入浅出 妙用Javascript中apply、call、bind
    单页Web应用优缺点
    JavaScript面向对象
    使用iframe的优缺点,为什么少用iframe以及iframe和frame的区别。
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6587378.html
Copyright © 2020-2023  润新知