蓝桥杯 112. 雷达设备(贪心)

这篇博客介绍了如何将雷达选点问题转化为小岛的区间覆盖问题,并采用贪心策略来解决。通过将所有区间按右端点排序,然后依次比较左端点与当前右端点,更新覆盖所需的雷达数量。代码实现中,首先读取小岛坐标,判断是否能覆盖所有岛屿,然后排序并应用贪心算法计算最少雷达数。
将雷达选点问题转化为小岛的区间覆盖为题。

贪心策略:将所有区间按照右端点排序,之后将左端点与当前右端点r0进行比较,若比r0要大,则将r0更新为新的区间的右端点,同时ans++。

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
map<PII,int> mp;
struct node{
    double l,r;
    
    bool operator<(const node& p){  //将区间按照右端点从小到大排序
        return r<p.r;
    }
}a[3000];
double getd(int c,int b)    //得到每个小岛覆盖区间
{
    double a=c*c-b*b;
    return sqrt(a);
}
int idx,n,d,ans;
bool flag;
int main()
{
    cin>>n>>d;
    int x,y;
    for (int i = 1; i <= n; i ++ )
    {
        cin>>x>>y;
        if(y>d) flag=true;  //如果该岛太远,则说明不能覆盖所有岛屿
        if(!mp[{x,y}])
        {
            mp[{x,y}]=i;
            double L=getd(d,y);
            a[idx++]={x-L,x+L}; //将每个小岛的覆盖区间加入数组
        }
    }
    if(flag)
    {
        puts("-1");
        return 0;
    }
    
    sort(a,a+idx);
    double r0=a[0].r;   //当前右端点
    ans=1;
    for (int i = 1; i < idx; i ++ )
    {
       if(a[i].l>r0)    //当前区间左端点比r0要大,要对右端点进行更新,同时雷达数+1
       {
           r0=a[i].r;
           ans++;
       }
        // cout<<a[i].l<<" "<<a[i].r<<endl;
    }
    cout<<ans;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值