http://poj.org/problem?id=1328
题的大意就是说在海里有小岛,坐标位置会给出,需要岸边的雷达覆盖所有的小岛,但雷达的覆盖范围有限,所以,需要最少的雷达覆盖所有的小岛,但若是有小岛没法被雷达给覆盖到,就输出-1;
这个题的话可以转化成区间问题就是看雷达的覆盖范围作为半径,A若是小岛的位置,根据雷达的覆盖范围只要不小于这个点的Y坐标,那个覆盖范围就是这个三角形的斜边,所以只要雷达位于1,2边上就可以覆盖到这个小岛
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std ; 8 struct node 9 { 10 double x,y; 11 } s[ 10001 ]; 12 int cmp( struct node a, struct node b) 13 { 14 if (a.y< b.y) 15 return 1 ; 16 else return 0 ; 17 } 18 int main() 19 { 20 int n,d ; 21 int cnt = 1 ; 22 while (cin>>n>> d) 23 { 24 25 int flag = 0 ; 26 if (n == 0 &&d == 0 ) break ; 27 double a,b ; 28 for ( int i = 1 ; i <= n ; i++ ) 29 { 30 scanf( " %lf %lf " ,&a,& b); 31 if (fabs(b) > d) 32 flag = 1 ; 33 s[i].x = a-sqrt(d*d-b* b); 34 s[i].y = a+sqrt(d*d-b* b); 35 } 36 cout<< " Case " << ' ' <<cnt<< ' : ' << ' ' ; 37 if (flag == 1 ) 38 cout<< " -1 " << endl ; 39 else 40 { 41 sort(s+ 1 ,s+ 1 + n,cmp); 42 int sum = 1 ; 43 double zhizhen = s[ 1 ].y; 44 for ( int i = 2 ; i <= n ; i++ ) 45 { 46 if (s[i].x> zhizhen) 47 { 48 sum++ ; 49 zhizhen = s[i].y; 50 } 51 } 52 53 cout<<sum<< endl; 54 } 55 cnt++ ; 56 } 57 return 0 ; 58 }