首页 > 代码库 > luogu P1325 雷达安装

luogu P1325 雷达安装

题目描述

描述:

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

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

样例1如图所示

技术分享

输入输出格式

输入格式:

 

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

接下来n行为岛屿坐标。

 

输出格式:

 

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

 

输入输出样例

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

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

#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>using namespace std;#define N 1005int 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;}

 

luogu P1325 雷达安装