码迷,mamicode.com
首页 > 其他好文 > 详细

【贪心】雷达问题

时间:2018-07-20 23:42:33      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:mem   one   first   pre   continue   std   view   spl   一条直线   

题目描述

张琪曼等人用时空雷达定位李旭琳所在的空间位置。如图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

 

【贪心】雷达问题

标签:mem   one   first   pre   continue   std   view   spl   一条直线   

原文地址:https://www.cnblogs.com/Rhythm-/p/9344574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!