博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1328 Radar Installation(经典贪婪)
阅读量:5145 次
发布时间:2019-06-13

本文共 2584 字,大约阅读时间需要 8 分钟。

Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 54143   Accepted: 12178

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, so an island in the sea can be covered by a radius installation, if the distance between them is at most d. 
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates. 
 
Figure A Sample Input of Radar Installations

Input

The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases. 
The input is terminated by a line containing pair of zeros 

Output

For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case.

Sample Input

3 21 2-3 12 11 20 20 0

Sample Output

Case 1: 2Case 2: 1

算法分析:

刚開始不知道从哪分析,后经指点发现圆心位置是个突破口。首先得出每个点所相应的圆心位置,注意若想覆盖最多。每个圆都尽量做到使点刚好位于圆边界。比方我们左右两边各有一个水果。我们不确定是否能拿得到两个,为了使得尽量拿到两个,我们会使左手刚好触碰到一个。伸右手去抓还有一个,而不是直接以某一个为中心而忽略增大自身所能更加接近还有一个的机会,于是问题就变成了求解圆心。依照圆心排序,不断更新雷达圆心,终于使数量最小

此外,注意代码凝视部分。。

圆心竖轴为0,横轴坐标计算公式:

r=x+sqrt(d*d-y*y)//圆心从左向右移动

#include
#include
#include
using namespace std;typedef struct island{ int x; int y; double z;}island;island land[1000];int Comp(island a,island b){ return a.z
>n>>d) { sign=0; if(!(n||d)) break; count=1,i=0; while(i
>land[i].x>>land[i].y; land[i].z=(double)land[i].x+sqrt(double(d*d-land[i].y*land[i].y)); //圆心必须浮点数啊有木有 if(abs(land[i].y)>d||d<=0) //注意。当雷达无法笼罩时的情况输出-1 sign=1; i++; } if(sign) {cout<<"Case "<
<<": -1"<

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/gcczhongduan/p/4792770.html

你可能感兴趣的文章
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
postgis几何操作函数集
查看>>
js用blob处理ajax请求的流文件
查看>>
ACM题目————还是畅通工程
查看>>
Cheerleaders UVA - 11806
查看>>
同步的数据过大,导致shareplex超时,并自动kill掉了同步会话
查看>>
数据挖掘十大算法--K-均值聚类算法
查看>>
Python实现QQ自动点赞
查看>>
Android事件传递机制
查看>>
Hello_World
查看>>
附录2
查看>>
js动态监听dom变化
查看>>
url传递中文的时候转码
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
35. Search Insert Position(C++)
查看>>
ubuntu 卡在登陆界面无法进入桌面,但是可以进入命令行界面
查看>>
python_day1
查看>>
【转】vim中多标签和多窗口的使用
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>