luogu P1325 雷達安裝
阿新 • • 發佈:2017-06-21
區域 定義 必須 lan iostream span 延伸 calc ios
輸入樣例#1:
題目描述
描述:
假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的一個點。雷達必須安裝在陸地上(包括海岸線),並且每個雷達都有相同的掃描範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃描範圍之內。
數據使用笛卡爾坐標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。
樣例1如圖所示
輸入輸出格式
輸入格式:
第一行包括2個整數n和d,n是島嶼數目,d是雷達掃描範圍。
接下來n行為島嶼坐標。
輸出格式:
一個整數表示最少需要的雷達數目,若不可能覆蓋所有島嶼,輸出“-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{ doublel,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 雷達安裝