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.
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 |
贪心。
一开始的思路:
图中ABCD为海岛的位置。假设本题半径为2(符合坐标系),那么A点坐标为(1,1)以此类推。
在题中,记录每个点的坐标,并把一个点新加一个标记变量以标记是否被访问过。
首先以A为圆心,r为半径做圆,交x轴与E1(右)点,做出如图中绿色虚线圆。然后以E1为圆心,半径为r做圆。看此时下一点(B)是否在该圆中。如果在,那么将该点标记变量变为true,再判下一点(C),如果不在那么就新增一个雷达。
后来,换了思路,存储图中红色圆与X轴的交点。
还是原来的贪心思路,仍然先排序,但排序的准则是按红色圆与x轴左交点的先后顺序。
如图,如果B点圆(且如此称呼)的左交点(J1点)在A点圆右交点(E1)左侧,那么B点一定涵盖在A点圆内部。再如图,如果D点圆的左交点(图中未标示)在A点圆的右交点(未标示)右,则D点不在A点圆中。
故,有如下代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<cmath> 7 using namespace std; 8 struct Node 9 { 10 double left,right; 11 }p[1006]; 12 bool cmp(Node a,Node b) 13 { 14 return a.left<b.left; 15 } 16 int main() 17 { 18 int n; 19 double r; 20 int ac=0; 21 while(scanf("%d%lf",&n,&r)==2 && (n || r)) 22 { 23 int f=1; 24 for(int i=0;i<n;i++) 25 { 26 double a,b; 27 scanf("%lf%lf",&a,&b); 28 if(b>r) 29 { 30 f=0; 31 } 32 else 33 { 34 p[i].left=a-sqrt(r*r-b*b); 35 p[i].right=a+sqrt(r*r-b*b); 36 } 37 } 38 printf("Case %d: ",++ac); 39 if(f==0) 40 { 41 printf("-1 "); 42 continue; 43 } 44 sort(p,p+n,cmp); 45 int ans=1; 46 Node tmp=p[0]; 47 for(int i=1;i<n;i++) 48 { 49 if(p[i].left>tmp.right) 50 { 51 ans++; 52 tmp=p[i]; 53 } 54 else if(p[i].right<tmp.right) 55 { 56 tmp=p[i]; 57 } 58 } 59 printf("%d ",ans); 60 61 } 62 return 0; 63 }