zoukankan      html  css  js  c++  java
  • luogu P1325 雷达安装

    题目描述

    描述:

    假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。

    数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。

    样例1如图所示

    输入输出格式

    输入格式:

    第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。

    接下来n行为岛屿坐标。

    输出格式:

    一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。

    输入输出样例

    输入样例#1:
    3 2
    1 2
    -3 1
    2 1
    
    输出样例#1:
    2

     贪心,把问题转化成岛屿覆盖的区域必须有雷达,之后类似于活动安排问题

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    #define N 1005
    int n,d;
    struct island{
        int x;int y;
    }is[N];
    struct miku{
        double l,r;
        bool operator < (const miku & a)const{
            return r < a.r;
        }
    }cd[N];
    double calc(double x)
    {
        return sqrt(1.0*d*d-x*x);
    }
    bool vis[N];
    int main()
    {
        cin>>n>>d;
        for(int i=1;i<=n;i++)
        {
            cin>>is[i].x>>is[i].y;
            if(is[i].y>d||d<0){cout<<"-1"<<endl;return 0;}
        }
        for(int i=1;i<=n;i++)
        {
            double len=calc(is[i].y);
            cd[i].l=is[i].x-len;
            cd[i].r=is[i].x+len;
        }
        sort(cd+1,cd+n+1);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                for(int j=1;j<=n;j++)
                {
                    if(!vis[j] && cd[j].l<=cd[i].r)
                    vis[j]=1;
                }
                ans++;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    用Java画QRCode二维码
    Require.js 详细了解
    JAVA下几个问题
    Eclipse中使用Maven创建Web时错误
    Windows下MySQL安装配置与使用
    搭建 LimeSurvey投票调查问卷系统
    服务器常见页面访问返回错误信息
    linux系统使用python监测网络接口获取网络的输入输出
    Linux操作系统知识
    lvs工作原理
  • 原文地址:https://www.cnblogs.com/sssy/p/7061412.html
Copyright © 2011-2022 走看看