贪心雷达问题

Posted rhythm-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心雷达问题相关的知识,希望对你有一定的参考价值。

题目描述

张琪曼等人用时空雷达定位李旭琳所在的空间位置。如图7.3所示,时空雷达装在一条直线上,直线上方是空间海洋,每个人在空间海洋的位置就如同大海中的岛屿,这些人的位置已知,每一个雷达的扫描范围是一个半径为d的圆形区域,问最少需要多少个雷达覆盖所有的人(岛屿)。

 

输入

输入包括多组测试数据,每组测试数据第一行为两个整数n (1≤n≤1000) 和 d,即岛屿数和雷达扫描半径。随后n行每行两个整数表示岛屿坐标。每组测试数据以空行间隔,所有测试数据以0 0结束。

 

输出

输出最少需要安装雷达数,每组一行。若无解以-1表示。

 

样例输入

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

样例输出

Case 1: 2
Case 2: 1

技术分享图片
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <map>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
pair<double,double>aa[115];
int n,d;
void init(){

}
void swap(int&a,int&b){
    int tmp=a;
    a=b;
    b=tmp;
}
bool cmp(pair<double,double>a,pair<double,double>b){
    return a.second<b.second;
}
void solve(){
    int cas=0;
    while(cin>>n>>d,n,d){
        bool flag=true;
        double x,y;
        range(i,0,n-1){
            cin>>x>>y;
            if(!flag)continue;
            if(y>d){
                flag=false;
                continue;
            }
            aa[i].first=(x-sqrt(d*d-y*y));
            aa[i].second=(x+sqrt(d*d-y*y));
        }
        cout<<"Case "<<++cas<<": ";
        if(!flag){
            cout<<-1<<endl;
            continue;
        }
        sort(aa,aa+n,cmp);
        double tmp=-123845;int ans=0;
        range(i,0,n-1)if(tmp<aa[i].first){
            ++ans;tmp=aa[i].second;
        }
        cout<<ans<<endl;
    }
}
int main() {
    init();
    solve();
    return 0;
}
View Code

 








以上是关于贪心雷达问题的主要内容,如果未能解决你的问题,请参考以下文章

112. 雷达设备贪心

贪心问题

贪心poj1328:雷达设置

阶段性总结-贪心算法

poj1328贪心中的区间问题

POJ-1328 区间贪心,几何