1328 poj
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 58386 | Accepted: 13155 |
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
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
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
先将之转化为各区间 接下来就是区间选点问题了 排序后选最后一个点就OK;
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 struct node{ 7 double x; 8 double y; 9 double l; 10 double r; 11 }island[1005]; 12 13 bool cmp(node a,node b) 14 { 15 if(a.r!=b.r) 16 return a.r<b.r; 17 else 18 return a.l>b.l; 19 } 20 21 int main() 22 { 23 int n,i,j,k,t=0,flg,num; 24 double d,local; 25 while(scanf("%d %lf",&n,&d)!=EOF) 26 { 27 flg=1;t++;num=1; 28 if(n==0 && d==0) 29 { 30 break; 31 } 32 for(i=1;i<=n;i++) 33 { 34 scanf("%lf %lf",&island[i].x,&island[i].y); 35 if(island[i].y>d) 36 flg=0; 37 } 38 if(flg==0) 39 { 40 printf("Case %d: -1 ",t); 41 continue; 42 } 43 for(i=1;i<=n;i++) 44 { 45 island[i].l=island[i].x-sqrt(d*d-island[i].y*island[i].y); 46 island[i].r=island[i].x+sqrt(d*d-island[i].y*island[i].y); 47 } 48 sort(island+1,island+n+1,cmp); 49 local=island[1].r; 50 for(i=2;i<=n;i++) 51 { 52 if(island[i].l<=local) 53 continue; 54 else 55 { 56 num++; 57 local=island[i].r; 58 } 59 } 60 printf("Case %d: %d ",t,num); 61 } 62 return 0; 63 }