Radar Installation -poj 1328

 
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 60277   Accepted: 13583

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 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

Case 1: 2
Case 2: 1
使用贪心算法解决。
 1 #include <iostream>
 2 #include<math.h>
 3 #include <algorithm>
 4 #include <stdlib.h>
 5 using namespace std;
 6 struct point
 7 {
 8     double left, right;
 9 }points[1000], temp;
10 
11 bool operator < (point a, point b)
12 {
13     return a.left < b.left;
14 }
15 int main() {
16     int num = 0;
17     double rad = 0;
18     cin >> num >> rad;
19     int casenum=1;
20     while (num || rad) {
21 
22 
23         int rnum=1;
24         int wrong = 0;
25 
26         for (int i = 0; i < num; i++) {
27             double x=0;
28             double y=0;
29             cin >> x >> y;
30 
31             if (y > rad) {
32                 //岛屿纵坐标大于雷达半径
33                 wrong = 1;
34             }else{
35                 //以岛屿为圆心,做圆,与x轴的交点
36                 points[i].left=x-sqrt((rad*rad-y*y)*1.0);
37                 points[i].right=x+sqrt((rad*rad-y*y)*1.0);
38 
39             }
40         }
41         if (wrong) {
42             //雷达不能覆盖
43             cout<<"Case "<<casenum++<<": "<<-1<<endl;
44         } else {
45             //按照岛屿画圆与x轴的左交点排序
46             sort(points, points + num);
47              temp=points[0];
48             for(int i=1;i<num;i++){
49                 //
50                 if(points[i].left>temp.right)//temp.right为公共区间的右端点,若下一个区间的左端点大于temp.right则该区间与以上的公共区间没有公共部分
51                 {
52                     rnum++;//雷达个数加1
53                     temp=points[i];//更新公共区间右端点
54                 }else if(points[i].right<temp.right){
55                      temp=points[i];//更新公共区间右端点
56                 }
57                 }
58 
59             cout<<"Case "<<casenum++<<": "<<rnum<<endl;
60         }
61 
62         cin >> num >> rad;
63     }
64     return 0;
65 }


原文地址:https://www.cnblogs.com/sdxk/p/4596264.html