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 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

Source

贪心。

一开始的思路:

图中ABCD为海岛的位置。假设本题半径为2(符合坐标系),那么A点坐标为(1,1)以此类推。

在题中,记录每个点的坐标,并把一个点新加一个标记变量以标记是否被访问过。

首先以A为圆心,r为半径做圆,交x轴与E1(右)点,做出如图中绿色虚线圆。然后以E1为圆心,半径为r做圆。看此时下一点(B)是否在该圆中。如果在,那么将该点标记变量变为true,再判下一点(C),如果不在那么就新增一个雷达。

后来,换了思路,存储图中红色圆与X轴的交点。

还是原来的贪心思路,仍然先排序,但排序的准则是按红色圆与x轴左交点的先后顺序。

如图,如果B点圆(且如此称呼)的左交点(J1点)在A点圆右交点(E1)左侧,那么B点一定涵盖在A点圆内部。再如图,如果D点圆的左交点(图中未标示)在A点圆的右交点(未标示)右,则D点不在A点圆中。

故,有如下代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<cmath>
 7 using namespace std;
 8 struct Node
 9 {
10     double left,right;
11 }p[1006];
12 bool cmp(Node a,Node b)
13 {
14     return a.left<b.left;
15 }
16 int main()
17 {
18     int n;
19     double r;
20     int ac=0;
21     while(scanf("%d%lf",&n,&r)==2 && (n || r))
22     {
23         int f=1;
24         for(int i=0;i<n;i++)
25         {
26             double a,b;
27             scanf("%lf%lf",&a,&b);
28             if(b>r)
29             {
30                 f=0;
31             }
32             else 
33             {
34                 p[i].left=a-sqrt(r*r-b*b);
35                 p[i].right=a+sqrt(r*r-b*b);    
36             }
37         }
38         printf("Case %d: ",++ac);
39         if(f==0)
40         {
41             printf("-1
");
42             continue;
43         }
44         sort(p,p+n,cmp);
45         int ans=1;
46         Node tmp=p[0];
47         for(int i=1;i<n;i++)
48         {
49             if(p[i].left>tmp.right)
50             {
51                 ans++;
52                 tmp=p[i];
53             }
54             else if(p[i].right<tmp.right)
55             {
56                 tmp=p[i];
57             }
58         }
59         printf("%d
",ans);
60         
61     }
62     return 0;
63 }
View Code
原文地址:https://www.cnblogs.com/UniqueColor/p/4762144.html