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 }