NYOJ 287 Radar
Radar
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- 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.
- 输入
- 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 - 输出
- 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.
- 样例输入
-
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
- 样例输出
-
Case 1: 2 Case 2: 1
思路:确定岛在x轴上可覆盖区间(即在此范围内,信号可覆盖岛)右边界排序;
代码:1 2 #include<stdio.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1005; 7 struct Line 8 { 9 double l,r; 10 }line[MAXN];//每个岛作半径为d的圆,截得区间 11 bool cmp(Line a,Line b) 12 { 13 return a.r<b.r; 14 } 15 int main() 16 { 17 int n,d; 18 int i; 19 int x,y; 20 int num=1,flag,count; 21 while(scanf("%d %d",&n,&d)&&n&&d) 22 { 23 flag=1; 24 for(i=0;i<n;i++) 25 { 26 scanf("%d %d",&x,&y); 27 if(!flag) continue; 28 if(y<=d){ 29 line[i].l=(double)x-sqrt((double)d*d-y*y); 30 line[i].r=(double)x+sqrt((double)d*d-y*y); 31 }else flag=0; 32 } 33 if(!flag) 34 { 35 printf("Case %d: -1\n",num++); 36 continue; 37 } 38 sort(line,line+n,cmp); 39 count=1; 40 double now=line[0].r; 41 for(i=1;i<n;i++) 42 { 43 44 if(line[i].l<=now+0.00005) continue; 45 now=line[i].r; 46 count++; 47 } 48 printf("Case %d: %d\n",num++,count); 49 } 50 return 0; 51 } 52
既有师,不如无师,即无师,不如有师。