奥赛一本通 1424 喷水装置
1424 喷水装置
题目大意
给定 $n$ 个区间,求覆盖 $1 \sim l$ 的范围至少需要多少个区间。
知识要点
几何、排序、贪心
解题思路
利用勾股定理计算每个水龙头可以覆盖的区间,将所有区间按左端点排序,在可以接上已选择区间右端点的前提下,选择右端点最靠右的区间。
参考代码
#include <bits/stdc++.h>
using namespace std;
struct Region {
double b, e;
} E[15005];
bool cmp(Region A, Region B) {
return A.b < B.b;
}
int main() {
int t, n, l, w;
scanf("%d", &t);
while(t--) {
scanf("%d%d%d", &n, &l, &w);
int m = 0, ans = 0, p, r;
double tmp, len = 0; //已覆盖区间的长度
for(int i = 0; i < n; i++) {
scanf("%d%d", &p, &r);
if(2 * r <= w) continue;
tmp = sqrt(r * r - w * w / 4.0);
E[m++] = {p - tmp, p + tmp};
}
sort(E, E + m, cmp);
for(int i = 0; i < m && len < l; ans++) {
for(tmp = len; i < m && E[i].b <= tmp; i++)
len = max(len, E[i].e); //记录右端点最大值
if(tmp == len) { //无法连接
ans = -1;
break;
}
}
printf("%d\n", ans);
}
return 0;
}

浙公网安备 33010602011771号