>解题思路
以建筑物为中心画半径为
d
d
d的圆,确定一个在
x
x
x轴上的区间,只要在这个区间内的雷达一定能扫到这个建筑物
l
l
l和
r
r
r可以根据勾股定理求,
l
=
x
−
d
2
+
y
2
l=x-\sqrt{d^2+y^2}
l=x−d2+y2,
r
=
x
+
d
2
+
y
2
r=x+\sqrt{d^2+y^2}
r=x+d2+y2
将区间按右端点从小到大排序
默认将雷达放在右端点上,如果最后一个雷达没有扫到当前点(不在当前点的区间内),那么就增加一个雷达
>Code
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
struct DT {
double x, y;
} a[1100];
long long n, d, ans;
double b[1100], x[1100], y[1100];
bool cmp(const DT& k, const DT& l) { return (k.y < l.y); }
int main() {
scanf("%lld%lld", &n, &d);
for (int i = 1; i <= n; i++) {
scanf("%lf%lf", &x[i], &y[i]);
if (abs(y[i]) > d) {//如果高度超过d,一定扫不到
printf("-1");
return 0;
}
a[i].x = x[i] - sqrt(d * d - y[i] * y[i]);//求l和r
a[i].y = x[i] + sqrt(d * d - y[i] * y[i]);
}
sort(a + 1, a + 1 + n, cmp);
b[++ans] = a[1].y;//默认将端点放在右端点上
for (int i = 2; i <= n; i++)
if (b[ans] < a[i].x)//如果雷达不在区间内(扫不到当前点)
b[++ans] = a[i].y;//加入一个雷达,也是放在右端点上
printf("%lld", ans);
}