• Radar Installation POJ


    题目大意(vj上的翻译版本)

    假定海岸线是无限长的直线。陆地位于海岸线的一侧,海洋位于另一侧。每个小岛是位于海洋中的一个点。对于任何一个雷达的安装 (均位于海岸线上),只能覆盖 d 距离,因此海洋中的小岛被雷达安装所覆盖的条件是两者间的距离不超过 d 。 我们使用卡笛尔坐标系,将海岸线定义为 x 轴。海洋的一侧位于 x 轴上方,陆地的一侧位于下方。给定海洋中每个小岛的位置,并给定雷达安装的覆盖距离,您的任务是写一个程序,找出雷达安装的最少数量,使得所有的小岛都被覆盖。注意:小岛的位置以它的 x-y 坐标表示。
    

    解法

    最初看到这个题也是一头雾水,根本无从下手,看了看网上的老哥的题解。发现要用逆向思维去做。也就是说这个要用岛去来找雷达,最终化成区间选点问题!!!

    怎么把圆化成线性区间以及解法?

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    double cal(double a,double b)
    {
      return sqrt(b*b-a*a);
    }
    struct node
    {
      double l,r;
    }num[10000];
    bool cmp(node a,node b)
    {
      return a.r==b.r?a.l>b.l:a.r<b.r;
    }
    int main()
    {
      /*ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);*/
      int n,d,cnt=0;
      while(cin>>n>>d&&n&&d)
      {
        int f=0;
        for(int i=0;i<n;i++)
        {
          double t1,t2;
          cin>>t1>>t2;
          if(t2>d)
          f=1;
          double delta=cal(t2,d);
          num[i].l=t1-delta;
          num[i].r=t1+delta;
        }
        sort(num,num+n,cmp);
        double now=num[0].r;
        int ans=1;
        for(int i=1;i<n;i++)
        if(num[i].l>now)
        {
          ans++;
          now=num[i].r;
        }
        printf("Case %d: ",++cnt);
        if(f)
        cout<<-1<<"
    ";
        else
        cout<<ans<<"
    ";
      }
    }
    
  • 相关阅读:
    Java中判断两个列表是否相等
    chrome:插件、跨域、调试....
    mac 开发环境采坑
    webpack升级踩坑
    js-使用装饰器去抖
    React setState 笔试题,下面的代码输出什么?
    react 解决:容器组件更新,导致内容组件重绘
    centos使用ngnix代理https
    javascript 理解继承
    js 数据监听--对象的变化
  • 原文地址:https://www.cnblogs.com/baccano-acmer/p/10152247.html
Copyright © 2020-2023  润新知