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;
}
posted @ 2021-07-29 20:26  ssl_lhj  阅读(38)  评论(1)    收藏  举报