- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
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 - 输入
-
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
先给贴上测试数据,推荐参考。大佬给的。2 5 -3 4 -6 3 4 5 -5 3 -3 5 2 3 3 3 20 8 -20 7 -18 6 -5 8 -21 8 -15 7 -17 5 -1 5 -2 3 -9 6 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 7 9 6 10 5 0 0 2 3 0 2 2 3 2 3 0 2 1 3 3 3 1 2 -3 2 2 4 8 5 2 4 -4 4 -3 3 -3 1 -3 0 -1 0 0 5 6 0 3 0 1 2 -3 1 2 1 3 2 1 2 -3 1 2 1 1 2 0 2 2 3 0 2 2 3 4 -5 4 3 4 3 2 3 6 -9 3 -3 1 2 -3 2 2 1 6 2 1 2 1 2 1 2 -3 1 2 1 0 0 1 2 0 2 2 3 0 2 1 3 3 10 1 10 2 3 4 5 3 5 1 10 2 3 4 5 4 7 1 10 2 3 4 5 0 0 3 9 1 10 2 3 4 5 0 0 ================结果:搬运自 http://poj.org/showmessage?message_id=141734 Case 1: 1 Case 2: 2 Case 3: 4 Case 4: 1 Case 5: 1 Case 6: -1 Case 7: 3 Case 8: -1 Case 9: 2 Case 10: 1 Case 11: 1 Case 12: -1 Case 13: -1 Case 14: 2 Case 15: 1 Case 16: 1 Case 17: 1 Case 18: -1 Case 19: -1 Case 20: -1
代码不难,关键要把每个点的区域排序,也要注意不要忽视小区间的右端点。
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct Node { 4 double left,right; 5 } node[1001]; 6 bool cmp(Node a,Node b) { 7 return a.left<b.left; 8 } 9 int main() { 10 int n,d,x,y,num=0; 11 while(cin>>n>>d&&n!=0) { 12 num++; 13 int ans=1; 14 int flag=1; 15 for(int i=0; i<n; i++) { 16 cin>>x>>y; 17 if(y>d&&flag) { 18 printf("Case %d: -1\n",num); 19 flag=0; 20 } 21 if(flag) { 22 node[i].left=x-sqrt(d*d-y*y); 23 node[i].right=x+sqrt(d*d-y*y); 24 } 25 } 26 if(flag) { 27 sort(node,node+n,cmp); 28 double rr=node[0].right; 29 for(int i=0; i<n; i++) { 30 rr=min(rr,node[i].right); 31 if(node[i].left>rr) { 32 ans++; 33 rr=node[i].right; 34 } 35 } 36 printf("Case %d: %d\n",num,ans); 37 } 38 39 } 40 41 return 0; 42 }