1. 程式人生 > >luogu P1325 雷達安裝

luogu P1325 雷達安裝

區域 定義 必須 lan iostream span 延伸 calc ios

題目描述

描述:

假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的一個點。雷達必須安裝在陸地上(包括海岸線),並且每個雷達都有相同的掃描範圍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; }

luogu P1325 雷達安裝