您的位置:首页 > 其它

Radar Installation -poj 1328

2015-06-24 19:43 302 查看
Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 60277Accepted: 13583
DescriptionAssume 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 InstallationsInputThe 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
OutputFor 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 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output
Case 1: 2
Case 2: 1
使用贪心算法解决。
#include <iostream>
#include<math.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
struct point
{
double left, right;
}points[1000], temp;

bool operator < (point a, point b)
{
return a.left < b.left;
}
int main() {
int num = 0;
double rad = 0;
cin >> num >> rad;
int casenum=1;
while (num || rad) {

int rnum=1;
int wrong = 0;

for (int i = 0; i < num; i++) {
double x=0;
double y=0;
cin >> x >> y;

if (y > rad) {
//岛屿纵坐标大于雷达半径
wrong = 1;
}else{
//以岛屿为圆心,做圆,与x轴的交点
points[i].left=x-sqrt((rad*rad-y*y)*1.0);
points[i].right=x+sqrt((rad*rad-y*y)*1.0);

}
}
if (wrong) {
//雷达不能覆盖
cout<<"Case "<<casenum++<<": "<<-1<<endl;
} else {
//按照岛屿画圆与x轴的左交点排序
sort(points, points + num);
temp=points[0];
for(int i=1;i<num;i++){
//
if(points[i].left>temp.right)//temp.right为公共区间的右端点,若下一个区间的左端点大于temp.right则该区间与以上的公共区间没有公共部分
{
rnum++;//雷达个数加1
temp=points[i];//更新公共区间右端点
}else if(points[i].right<temp.right){
temp=points[i];//更新公共区间右端点
}
}

cout<<"Case "<<casenum++<<": "<<rnum<<endl;
}

cin >> num >> rad;
}
return 0;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: