首页 > 代码库 > POJ 1328 Radar Installation(贪心)

POJ 1328 Radar Installation(贪心)

题目网址:http://poj.org/problem?id=1328

题目:

Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 88789   Accepted: 19915

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


思路:

当海岛到x轴的距离超过d时,必定不能覆盖输出-1。否则,以海岛为圆心,雷达覆盖范围为半径做圆,得到圆与x轴的交点。分别记录n个海岛的左交点和右交点。

技术分享


将区间按照右交点升序排序,遍历区间,找到不能包含当前区间的右交点的区间,雷达数加一。(贪心算法)
代码:
 1 #include <cstdio>
 2 #include <vector>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std;
 6 struct node{
 7     double l,r;
 8 };
 9 vector<node>v,vt;
10 int n,d;
11 int flag;
12 int ind=0;
13 bool cmp(node x,node y){
14     return x.r<y.r;//注意是按照右交点排序
15 }
16 int main(){
17     int x,y;
18     while (scanf("%d%d",&n,&d)!=EOF && (n!=0 || d!=0)) {
19         int res=0;
20         printf("Case %d: ",++ind);
21         v.clear();
22         flag=0;
23         for (int i=0; i<n; i++) {
24             scanf("%d%d",&x,&y);
25             if(fabs(y)>d)  flag=1;
26             node t;
27             t.l=x-sqrt(d*d-y*y);//左交点
28             t.r=x+sqrt(d*d-y*y);//右交点
29             v.push_back(t);
30             
31         }
32         if(flag){
33             printf("-1\n");
34             continue;
35         }
36         sort(v.begin(), v.end(), cmp);
37         int j=0;
38         while(j<v.size()){
39             double r=v[j].r;
40             int t=j;
41             while(v[j+1].l<=r && v[j+1].r>=r )    j++;//找到一个区间不包含外层区间的右交点
42             j++;
43             res++;
44         }
45         printf("%d\n",res);
46     }
47     return 0;
48 }

 

 

POJ 1328 Radar Installation(贪心)