POJ 1328 Radar Installation 题解

本文介绍了一个关于使用半径为d的雷达覆盖n个小岛的问题,通过排序加贪心算法求解最少雷达数量。首先判断是否有不可覆盖的小岛,然后计算每个小岛的可设雷达范围,并从中选择合适的点确保所有小岛都能被覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目意思:有n个小岛,所有小岛要被半径为d的雷达覆盖,问最少需要多少雷达
排序+贪心
如果有一个小岛的纵坐标大于雷达半径,肯定不能覆盖;
这道题可以从小岛的角度来思考问题,先求出每个小岛的可设雷达区间,在这些区间选点,保证每个区间都有点。



#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <list>
#define LL long long
#define INF 0x7fffffff
#define FIN 0x80000000
using namespace std;
struct island
{
    double le,ri;
};
island data[1002];
bool cmd(island a,island b)
{
    if(a.ri==b.ri) return a.le>b.le;
    return a.ri<b.ri;
}
int main()
{
    int n,d,cas=0;
    while(scanf("%d %d",&n,&d),n||d)
    {
        int x,y,flag=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&x,&y);
            if(flag) continue;
            if(y>d) { flag=1; continue; }
            double t=sqrt((double)d*d-y*y);
            data[i].le=x-t;
            data[i].ri=x+t;
        }
        if(flag)
        {
            printf("Case %d: -1\n",++cas);
            continue;
        }
        sort(data,data+n,cmd);
//        for(int i=0;i<n;i++)
//            printf("%d %d##\n",data[i].le,data[i].ri);
        int cnt=1;
        double k=data[0].ri;
        for(int i=1;i<n;i++)
        {
            while(i<n&&data[i].le<=k) i++;
            if(i>=n) break;
            cnt++;
            k=data[i].ri;
        }
        printf("Case %d: %d\n",++cas,cnt);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值