YBTOJ: 雷达装置
题目大意
在平面上有许多建筑物,现在要在x轴上安装雷达,求最少的雷达安装数目。
题目分析
对于任意一个建筑物,都有一个对于它的雷达建造区间,使得它能被雷达探测到。
所以问题转化成:给定n个区间,在数轴上建造尽量少的点,使得每个区间内都至少有一个点。
麻烦的就是怎么获取左右端点的值
根据勾股定理,l=x-sqrt(dd-yy),r=x+sqrt(dd+yy);
注意要用double类型
再来考虑无解情况
很明显,当建筑物所在的点与x轴的距离即y超过d时,这个建筑物就不可能被探测到。
Code
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#define sco 10000
using namespace std;
struct ld{
double l,r;
}a[sco];
int n,d,ans(1);
double pos;
bool cmp(ld x,ld y){
return x.r<y.r;
}
int main(){
scanf("%d%d",&n,&d);
for(int i=1,x,y;i<=n;++i){
scanf("%d%d",&x,&y);
if(y>d){
printf("-1");exit(0);
}else{
a[i].l=double(x-sqrt(d*d-y*y));
a[i].r=double(x+sqrt(d*d-y*y));
}
}
sort(a+1,a+n+1,cmp);pos=a[1].r;
for(int i=2;i<=n;++i){
if(a[i].l<=pos)continue;
else {++ans;pos=a[i].r;}
}
printf("%d",ans);
return 0;
}

浙公网安备 33010602011771号