【贪心】雷达问题

题目描述

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

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

时间: 2024-11-18 08:27:47

【贪心】雷达问题的相关文章

poj1328贪心 雷达,陆地,岛屿问题

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 60381   Accepted: 13610 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point loca

poj1328雷达设置 贪心

Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only

Poj 1328(雷达安装)几何+贪心

[题目描述]: 给定n个小岛以及这些小岛的位置,并输入雷达的辐射面积,问最少需要多少个雷达站才能覆盖所有小岛? [思路分析]: 本题首先想到的是运用贪心算法,但是算法想到了如何贪心?这道题我自己开始做之时只有一点思路,就是让每一个雷达覆盖较多的点,但是如何较多覆盖,这就是典型的数学问题了,自己没有思索出来,最后在网上看了题解才明白如何做.下面我们看看如何建图: 我们通过这个图首先运用了一个数学知识,就是以小岛为圆心,雷达辐射范围为圆心建立一个圆,该圆与x轴有一个交点,以该交点作为雷达站铺设点那么

POJ 1328 Radar Installation 雷达安装 贪心问题求解

题目链接: POJ 1328 Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coas

POJ 1328 Radar Installation-放置雷达(贪心,区间,二维转一维)

http://poj.org/problem?id=1328 这个题题意是说,海上有n多岛,在海岸线上(x轴)建一个雷达能覆盖到与它距离不超过d的岛,求覆盖所有岛的最小雷达数. . . . . . . . . . 本题贪心思路是把点转化为在x轴坐标上的区间(即能保证覆盖该小岛的雷达所有可能位置的集合),然后按点的顺序排也行,按左端点排也行.然后最左边的依次向右遍历,如果下一个区间的最左端在上一个雷达的右端,显然需要放一个新雷达:如果在左端的话,则需要判断最右端了,如果最右端也在上个雷达左端的话,

贪心 Radar Installation (求最少探测雷达)

Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, s

【贪心】poj1328:雷达设置

Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, s

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优

【贪心】POJ1328-Radar Installation

[思路] 以每一座岛屿为圆心,雷达范围为半径作圆,记录下与x轴的左右交点.如果与x轴没交点,则直接退出输出“-1”.以左交点为关键字进行排序,从左到右进行贪心.容易知道,离每一个雷达最远的那一座岛与雷达相距恰巧为半径的时候,可以得到最优解.假设上一个雷达与第before座岛相距为半径大小,对于当前的岛屿i: 如果before岛的右交点在i岛左交点的左侧,此时必然需要一个新的雷达,将当前before暂定为i,雷达数加一: 如果before岛的右交点在i岛右交点的右侧,为了让雷达举例尽可能地广,将雷