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;
}

 

posted @ 2017-06-21 19:44  zzzzx  阅读(294)  评论(0编辑  收藏  举报