9. 雷达安置
XJOI - 题目ID:9559选做题100分
最新提交:
Wrong Answer
90 分
历史最高:
Wrong Answer
90 分
时间限制: 100ms
空间限制: 131072kB
题目描述
题目描述:
假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。注意,建立雷达站的点的坐标必须为整数。
数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。
[image]
输入格式:
第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。
接下来n行为岛屿坐标,均为整数。
输出格式:
一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。
样例输入:
3 2 1 2 -3 1 2 1
样例输出:
2
约定:
n<=1000,d<=20000
-210^6<=xi<=210^6
0<=yi<=20000
代码:
`#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
struct node{
int l,r;
}a[100005];
bool cmp(node x,node y){
if(x.r!=y.r) return x.r<y.r;
else return x.l<y.l;
}
vector<int>v;
int main(){
int n,d;
cin>>n>>d;
int x,y;
long long cnt=0;
for(int i=1;i<=n;i++){
cin>>x>>y;
if(y<=d){
cnt++;
a[cnt].l=x-sqrt(d*d-y*y);
a[cnt].r=x+sqrt(d*d-y*y);
}
else{
cout<<"-1";
return 0;
}
}
sort(a+1,a+cnt+1,cmp);
long long sum=0;
bool flag;
for(int i=1;i<=cnt;i++){
flag=false;
for(int j=0;j<v.size();j++){
if(v[j]>=a[i].l&&v[j]<=a[i].r){
flag=true;
break;
}
}
if(!flag){
v.push_back(a[i].r);
sum++;
}
}
cout<<sum;
return 0;
}`