POJ 1328 Radar Installation [贪心]

博客提出一个海岸雷达覆盖问题,即给定一个以海岸线为X轴的坐标系,海上有岛,雷达覆盖距离为d,求在海岸线上放置雷达的最小数量以覆盖所有岛。解决方法是先算出能覆盖的海岸线区间,将其转化为区间覆盖问题,按区间尾升序排序,通过特定逻辑确定雷达放置位置。

#Description
一个坐标系,X轴是海岸线,上面是海,下面是大陆,海上有岛,要在海岸线上放雷达,雷达距离d,问最小放几个雷达,能全部覆盖?
#Algorithm
首先把能覆盖的海岸线区间算出来,就变成区间问题了。这次要求是最少放几个,就能把所有区间覆盖。那肯定是放头或者放尾。假设放尾,那先按尾作升序排序。第一个就是尾最小的。这个必须放,不放的话这个区间就不能覆盖。所以放这里。然后往后面找,如果区间头在这个尾前的,说明都覆盖到了。所以可行。
#Code

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 2000;
int n=0, d=0;
class V
{
public:
    double l, r;
};
bool compare(const V &a, const V &b)
{
    if (a.r < b.r) return true;
    return false;
}
int solve()
{
    V a[maxn];
    int ans = 0;
    for (int i=0; i<n; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        if (y>d) ans = -1;
        double r = sqrt(d*d - y*y);
        a[i].l = x - r;
        a[i].r = x + r;
    }
    if (ans == -1) return ans;
    sort(a, a+n, compare);
    int i = 0;
    do
    {
        double marked = a[i].r;
        i++;
        while (i<n&&a[i].l<=marked) i++;
        ans++;
    }while (i<n);
    return ans;
}
int main()
{
    for (int i=1;;i++)
    {
        scanf("%d%d", &n, &d);
        if (n==0 && d==0) break;
        printf("Case %d: %d\n", i, solve());
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值