雷达装置
题目
有 n n n 个建筑物,第 i i i 个建筑物在笛卡尔坐标系上的坐标为 ( x i , y i ) (x_i,y_i) (xi,yi) ,你需要在 x x x 轴上安装一些雷达,每个雷达的侦察半径均为 d d d,要求每个建筑物都至少被一个雷达侦测到,求最少要安装几个雷达
输入
第一行两个正整数 n , d n,d n,d
接下来 n n n行,第 i i i 行两个整数 x i , y i x_i,y_i xi,yi
输出
输出一行表示答案,若没有解决方案,则答案为 − 1 -1 −1
输入样例
3 2
1 2
-3 1
2 1
输出样例
2
解题思路
我们设坐标为
(
x
,
y
)
(x,y)
(x,y),由勾股定理得
d
<
y
d < y
d<y时是不能被检测到的
那我们可以🤔考虑🤔用贪心,可以保证所有区间内至少有一个点,那放的所有点的区间内两两没有交集
因此我们至少要选出
k
k
k个点
程序如下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n, d, x[100001], y[100001], ans;
struct part
{
double l, r;
}a[1000001];
bool operator < (part a, part b)
{
return a.r < b.r;
}
int main()
{
scanf("%d%d",&n,&d);
for(int i = 1; i <= n; ++i)
scanf("%d%d",&x[i],&y[i]);
for(int i = 1; i <= n; ++i)
{
if(d < y[i])
{
printf("-1\n");
return 0;
}
a[i].l = x[i] - sqrt(1ll * d * d - 1ll * y[i] * y[i]);
a[i].r = x[i] + sqrt(1ll * d * d - 1ll * y[i] * y[i]);
}
sort(a + 1, a + 1 + n);
ans = 1;
double pos = a[1].r;
for(int i = 2; i <= n; ++i)
{
if(a[i].l <= pos && pos <= a[i].r)
continue;
else
{
ans++;
pos = a[i].r;
}
}
printf("%d",ans);
return 0;
}