poj1328 Radar Installation

9 篇文章 0 订阅
4 篇文章 0 订阅
本文介绍了一个基于贪心算法解决雷达覆盖问题的方法。该问题设定为在Y轴上有多个岛屿,需要在X轴上设置雷达来覆盖这些岛屿,目标是最小化雷达数量。通过将岛屿按最远覆盖距离排序并依次放置雷达,实现最小覆盖方案。
摘要由CSDN通过智能技术生成

题目大意:在y轴正方向有n个岛屿(n <=1000),在x轴上建立雷达,其覆盖范围是d,求最少建立多少个雷达。
题解:贪心,每个岛屿在[l,r]范围内建立雷达即可覆盖,那么我们有n个区间,我们按照r排序,第一个在r处建立,从左往右扫描,依次建立,如果没被覆盖过,就在r处建雷达(在r总比在l优),复杂度 O(n2)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 1005
using namespace std;
struct A{
    double l,r;
    bool operator <(const A &t){
        return r<t.r;
    }
}a[N];
bool vis[N],fl;
int n,cnt,k;
double d,x,y;
int main(){
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    for(;scanf("%d%lf",&n,&d)&&n&&d;){
        cnt=0;fl=0;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&x,&y);
            if(y>d){
                printf("Case %d: -1\n",++k);
                fl=1;break;
            }
            a[i].l=x-sqrt(d*d-y*y);
            a[i].r=x+sqrt(d*d-y*y);
        }
        if(fl) continue;
        sort(a+1,a+1+n);
        //for(int i=1;i<=n;i++) printf("%lf %lf\n",a[i].l,a[i].r);
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                cnt++;
                vis[i]=1;
                for(int j=i;j<=n;j++)
                    if(a[j].l<=a[i].r) vis[j]=1;
            }
        }
        printf("Case %d: %d\n",++k,cnt);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值