POJ 1328 Radar Installation(区间选点)
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.
![](http://poj.org/images/1328_1.jpg)
Figure A Sample Input of Radar Installations
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.
![](http://poj.org/images/1328_1.jpg)
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
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<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 6 struct len 7 { 8 double start; 9 double end; 10 }; 11 12 bool cmp(len a,len b) 13 { 14 if(a.end==b.end) 15 return a.start<b.start; 16 return a.end<b.end; 17 } 18 19 double cal(int y,int d) 20 { 21 return sqrt((double)(d*d-y*y)); 22 } 23 24 int main() 25 { 26 //freopen("in.txt","r",stdin); 27 bool flag; 28 len a[1005]; 29 int n,d,i; 30 int kase=0; 31 while(scanf("%d%d",&n,&d),n||d) 32 { 33 flag=false; 34 for(i=0;i<n;i++) 35 { 36 int x,y; 37 scanf("%d%d",&x,&y); 38 if(flag) 39 continue; 40 if(y>d) 41 flag=true; 42 double temp=cal(y,d); 43 a[i].start=x-temp; 44 a[i].end=x+temp; 45 } 46 if(flag) 47 printf("Case %d: -1\n",++kase); 48 if(!flag) 49 { 50 sort(a,a+n,cmp); 51 int cnt=1; 52 double v=a[0].end; 53 for(i=1;i<n;i++) 54 { 55 if(v<a[i].start) 56 { 57 cnt++; 58 v=a[i].end; 59 } 60 } 61 printf("Case %d: %d\n",++kase,cnt); 62 } 63 } 64 return 0; 65 }