奥赛一本通 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;
}
posted @ 2026-08-29 09:07  萧西待水  阅读(4)  评论(0)    收藏  举报