题目描述
假设陆地的海岸线是一条无限延长的直线,海岛是一个个的点,现需要在海岸线上安装雷达,使整个雷达系统能够覆盖到所有的海岛。雷达所能覆盖的区域是以雷达为圆心半径为d的圆,我们用指标坐标系来描述,海岸线就是x轴,现在给出每个海岛的坐标与雷达的半径d,请编写一个程序计算出最少需要多少个雷达才能够将所有海岛全部覆盖?
输入
数据第一行为n (1<=n<=1000),d,n为海岛个数,d为雷达半径,接下来n行,每行两个数描述海岛坐标。
输出
输出最少需要的雷达个数,如果不能满足,则输出-1,具体格式见样例。
样例输入
3 2
1 2
-3 1
2 1
样例输出
2
#include<bits/stdc++.h>
using namespace std;
typedef pair<double, double> P;
double n, d;
struct ST
{
double left;
double right;
};
int cmp(P a, P b)
{
return a.first < b.first;
}
int main()
{
int Case = 1;
while(cin>>n>>d)
{
if(n == 0 && d == 0)
break;
ST st[1010];
vector<P> vec;
int flag = 0;
for(int i = 0; i<n; i++)
{
cin>>st[i].left>>st[i].right;
if(fabs(st[i].right) > d)
flag = 1;
double left = st[i].left*1.0 - sqrt(d*d - st[i].right*st[i].right);
double right = st[i].left*1.0 + sqrt(d*d - st[i].right*st[i].right);
vec.push_back(P(left, right));
}
if(flag)
{
cout<<-1<<endl;
continue;
}
sort(vec.begin(), vec.end(), cmp);
int res = 1;
double end = vec[0].second;
for(int i = 1; i<vec.size(); i++)
{
if(vec[i].second < end)
{
end = vec[i].second;
}
else if(vec[i].first > end)
{
end = vec[i].second;
res++;
}
}
cout<<res<<endl;
}
return 0;
}