POJ 1328 Radar Installation

Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 77040   Accepted: 17257

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

 
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 const int maxn=1005;
 8 typedef struct islands{
 9     double l,r;
10     islands(double l=0,double r=0):r(r),l(l){}
11 }I;
12 struct cmp{
13     bool operator()(const I &a,const I &b){
14         return a.r>b.r;
15     }
16 };
17 priority_queue<I,vector<I>,cmp>que;
18 int main()
19 {
20     int n,ans,ca=1;
21     double d,x,y,z,lef;
22     bool flag;
23     while(scanf(" %d%lf",&n,&d)==2&&n&&d)
24     {
25         flag=false;
26         ans=0; lef=-100000000;
27         for(int i=0;i<n;i++){
28             scanf("%lf%lf",&x,&y);
29             if(y>d) flag=true;
30             z=sqrt(d*d-y*y);
31             que.push(I(x-z,x+z));
32         }
33         if(flag){printf("Case %d: %d\n",ca++,-1); continue;}
34         I ra=que.top(); que.pop(); ans++;
35         lef=ra.r;
36         while(que.size()){
37             ra=que.top();
38             que.pop();
39             if(lef>ra.r) lef=ra.r;
40             else if(lef<ra.l){ans++; lef=ra.r;}
41         }
42         printf("Case %d: %d\n",ca++,ans);
43     }
44 
45 }

 

posted @ 2016-09-01 18:02  Cumulonimbus  阅读(150)  评论(0编辑  收藏  举报