【ybtoj】【贪心】【例题2】雷达装置

传送门
题目


>解题思路

以建筑物为中心画半径为 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=xd2+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);
}

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/111710319