zoukankan      html  css  js  c++  java
  • POJ 1328 Radar Installation(贪心)

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

    题意:

    假设滑行是无限直线。土地在海岸的一边,海在另一边。每个小岛是位于海边的一个点。位于海岸上的任何雷达装置只能覆盖距离,所以如果两者之间的距离最大为d,则海中的岛屿可以被半径装置覆盖。 
    我们使用笛卡尔坐标系,定义惯性是x轴。海侧在x轴之上,陆侧在下。考虑到每个岛屿在海洋中的位置,并且考虑到雷达装置的覆盖距离,您的任务是编写一个程序,以找到覆盖所有岛屿的最少数量的雷达装置。注意,岛的位置由其xy坐标表示。 

    思路:

    由于雷达只能处于x轴位置,所以对于每个雷达,我们都可以计算出能覆盖它的雷达的最大区间,即最小最坐标和最大右坐标。

    接下来是贪心,按照右坐标从小到大排序,只要区间有交集,就可以用一个雷达来覆盖。

     1 #include<iostream> 
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<math.h>
     5 using namespace std;
     6 
     7 const int maxn = 1000 + 5;
     8 
     9 int d, n;
    10 int vis[maxn];
    11 
    12 struct node
    13 {
    14     double left, right;
    15 }a[maxn];
    16 
    17 bool cmp(node a, node b)
    18 {
    19     return a.right < b.right ;
    20 }
    21 
    22 double cacl(int y)
    23 {
    24     return sqrt((double)(d*d - y*y));
    25 }
    26 
    27 int main()
    28 {
    29     //freopen("D:\txt.txt", "r", stdin);
    30     int x, y, kase = 0;
    31     while (cin >> n >> d && n)
    32     {
    33         memset(vis, 0, sizeof(vis));
    34         int ok = 0;
    35         for (int i = 0; i < n; i++)
    36         {
    37             cin >> x >> y;
    38             if (y > d)   {ok = 1;}   //如果y>d,肯定覆盖不着
    39             if (!ok)
    40             {
    41                 double ra = cacl(y);
    42                 //雷达的左右区域
    43                 a[i].left = x - ra;    
    44                 a[i].right = x + ra;
    45             }
    46         }
    47         if (!ok)
    48         {
    49             sort(a, a + n, cmp);
    50             int cnt = 0;
    51             for (int i = 0; i < n; i++)
    52             {
    53                 if (!vis[i])
    54                 {
    55                     vis[i] = 1;
    56                     for (int j = 0; j < n; j++)
    57                     {
    58                         if (!vis[j] && a[j].left <= a[i].right)
    59                             vis[j] = 1;
    60                     }
    61                     cnt++;
    62                 }
    63             }
    64             cout << "Case " << ++kase << ": " << cnt << endl;
    65         }
    66         else  cout << "Case "<<++kase << ": -1" << endl;
    67     }
    68     return 0;
    69 }

             

     

  • 相关阅读:
    可实现B站 蒙版弹幕 效果的前端组件 —— Barrage UI
    C# 中的"yield"使用
    不遮挡人物弹幕是怎么实现的——图片蒙版效果-webkit-mask
    使用eslint检查代码质量
    vue 项目中assets 和static的区别
    快速生成html文本文档——typora
    VsCode中好用的git源代码管理插件GitLens
    C# 根据前台校验的值,决定是否执行后台方法
    C# 从字符串中取出英文字母
    C# 科学计数法转换成数字
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6361038.html
Copyright © 2011-2022 走看看