題目描述:
假定海岸線是一條無限延伸的直線,陸地在海岸線的一邊,大海在另一側。海中有許多島嶼,每一個小島我們可以認為是一個點。現在要在海岸線上安裝雷達,雷達的覆蓋范圍是d,也就是說大海中一個小島能被安裝的雷達覆蓋,那么它們之間的距離最大為d。
我們使用平面直角坐標系,定義海岸線是x軸,大海在x軸上方,陸地在下方。給你海中每一個島嶼的坐標位置(x,y)和要安裝的雷達所覆蓋的范圍d,你的任務是寫一個程序計算出至少安裝多少個雷達能將所有的島嶼覆蓋。
輸入描述:
第一行兩個整數n(1≤n≤100000)和d,分別表示海中島嶼的數目和雷達覆蓋的范圍半徑d。
接下來n行,每行兩個整數,表示每個島嶼的坐標位置(x,y)。
輸出描述:
一行一個整數,即能將所有島嶼全部覆蓋至少安裝的雷達個數,如果無解則輸出“-1”。
樣例輸入:
3 2
1 2
-3 1
2 1
樣例輸出:
2
數據范圍及提示:
(1≤n≤100000)
注意會輸出-1
思路:
貪心思想
盡量使島嶼位於圓的邊上,所以與處理一下:在圖形中就是計算出以d為半徑,p2為圓心的圓與x軸的交點(只處理左邊的),記為點m。
然后算一下p3與m的距離,如果大於d,則ans++。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100010;
struct node
{
int x;
int y;
double z;
bool operator < (node tmp)const
{
return tmp.z>z;
}
}a[maxn];
int n,d,ans=1;
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
if(a[i].y>d)//判斷-1情況
{
cout<<-1;
return 0;
}
a[i].z=double(a[i].x)+sqrt(double(d*d)-double(a[i].y*a[i].y));//處理與x軸交點坐標
}
sort(a+1,a+n+1);//排序
double tmp=a[1].z;
for(int i=2;i<=n;i++)//統計雷達個數
if((a[i].x-tmp)*(a[i].x-tmp)+a[i].y*a[i].y>d*d)
ans++,tmp=a[i].z;
cout<<ans;//輸出
return 0;
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。