poj1328 雷达安装问题

描述

假设滑行是无限直线。土地位于海岸的一侧,海洋位于另一侧。每个小岛都位于海边。并且位于滑行的任何雷达装置只能覆盖d距离,因此如果它们之间的距离最多为d,则可以通过半径装置覆盖海中的岛屿。 

我们使用笛卡尔坐标系,定义滑行是x轴。海侧在x轴上方,陆侧在下方。考虑到每个岛屿在海中的位置,并考虑到雷达装置覆盖范围的距离,您的任务是编写一个程序,以找到覆盖所有岛屿的最小数量的雷达装置。注意,岛的位置由其xy坐标表示。 

这个题最开始是想以雷达为圆心来判断圆内的点,发现不知道如何判断几个点是否在一个圆内,而且不知道雷达的坐标,后来换思路(网上借鉴),要以点为中心,跟x轴相交于两点,在这条线上的雷达都可以包含这个点,要得到雷达最小,就要使得线段重合得最多,问题变成了贪心+区间线段问题。

  1. #include <iostream>
  2. #include <math.h>
  3. #include <algorithm>
  4. using namespace std;
  5. const int MAXN = 1010;
  6. int T, n, d;
  7. struct node
  8. {
  9.     double left, right;
  10. }a[MAXN];
  11. bool operator < (const node &a, const node &b)
  12. {
  13.     return a.left < b.left;
  14. }
  15. int solve()
  16. {
  17.     int ans;
  18.     double now;
  19.     sort(a, a + n);
  20.     ans = 1;
  21.     now = a[0].right;
  22.     for (int i = 1; i < n; ++i)
  23.     {
  24.         if (a[i].left <= now)
  25.         {
  26.             now = min(a[i].right, now);
  27.         }
  28.         else
  29.         {
  30.             ++ans;
  31.             now = a[i].right;
  32.         }
  33.     }
  34.     return ans;
  35. }
  36. int main()
  37. {
  38.     int x, y;
  39.     int flag;
  40.     T = 0;
  41.     while (1)
  42.     {
  43.         ++T;
  44.         flag = 1;
  45.         cin >> n >> d;
  46.         if (n == 0 && d == 0)break;
  47.         for (int i = 0; i < n; ++i)
  48.         {
  49.             cin >> x >> y;
  50.             if (y > d)
  51.             {
  52.                 flag = 0;
  53.                 break;
  54.             }
  55.             else
  56.             {
  57.                 if (y == d)
  58.                 {
  59.                     a[i].left = a[i].right = x;
  60.                 }
  61.                 else
  62.                 {
  63.                     a[i].left = x - sqrt(d*d - y * y);
  64.                     a[i].right = x + sqrt(d*d - y * y);
  65.                 }
  66.             }
  67.         }
  68.         if (flag)
  69.         {
  70.             cout << "Case " << T << ":  " << solve() << endl;
  71.         }
  72.         else
  73.         {
  74.             cout << "Case " << T << ":  -1" << endl;
  75.         }
  76.     }
  77.     return 0;
  78. }

猜你喜欢

转载自blog.csdn.net/qq_40327837/article/details/85770493
今日推荐