http://poj.org/problem?id=1328
海洋在海岸线上面,陆地在海岸线下面,然后有一些岛屿分布在海洋的各个地方,有一些雷达在海岸线上,覆盖半径为d,问至少需要多少雷达才能全部覆盖这些岛屿。
以岛屿坐标为圆心,d为半径的圆与x轴的两个交点之间的范围就是雷达在这个范围内任何一个地方都能覆盖这个岛屿,求出每一条线段,然后按起点排序,贪心求解。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <string> 9 #include <set> 10 #include <functional> 11 #include <numeric> 12 #include <sstream> 13 #include <stack> 14 #include <map> 15 #include <queue> 16 17 #define CL(arr, val) memset(arr, val, sizeof(arr)) 18 19 #define ll long long 20 #define inf 0x7f7f7f7f 21 #define lc l,m,rt<<1 22 #define rc m + 1,r,rt<<1|1 23 #define pi acos(-1.0) 24 25 #define L(x) (x) << 1 26 #define R(x) (x) << 1 | 1 27 #define MID(l, r) (l + r) >> 1 28 #define Min(x, y) (x) < (y) ? (x) : (y) 29 #define Max(x, y) (x) < (y) ? (y) : (x) 30 #define E(x) (1 << (x)) 31 #define iabs(x) (x) < 0 ? -(x) : (x) 32 #define OUT(x) printf("%I64d ", x) 33 #define lowbit(x) (x)&(-x) 34 #define Read() freopen("a.txt", "r", stdin) 35 #define Write() freopen("b.txt", "w", stdout); 36 #define maxn 1000000000 37 #define N 1010 38 using namespace std; 39 40 struct point 41 { 42 double x,y; 43 }p[1010]; 44 bool cmp(const point &a,const point &b) 45 { 46 return a.x<b.x; 47 } 48 49 int main() 50 { 51 //Read(); 52 //Write() 53 int n,d,a,b,j=1; 54 while(~scanf("%d%d",&n,&d)) 55 { 56 if(n==0&&d==0) break; 57 bool flag=0; 58 for(int i=0;i<n;i++) 59 { 60 scanf("%d%d",&a,&b); 61 if(b>d||b<0) flag=1; 62 p[i].x=a-sqrt(1.0*(d*d-b*b)); 63 p[i].y=a+sqrt(1.0*(d*d-b*b)); 64 } 65 if(flag) {printf("Case %d: -1 ",j++); continue;} 66 sort(p,p+n,cmp); 67 // for(int i=0;i<n;i++) 68 // printf("%lf %lf ",p[i].x,p[i].y); 69 double ans=p[0].y; 70 int m=1; 71 for(int i=1;i<n;i++) 72 { 73 if(p[i].y<ans) ans=p[i].y; //这里需要注意,ans必须更新保证覆盖当前终点小的岛屿。 74 else if(p[i].x>ans) 75 { 76 m++; 77 ans=p[i].y; 78 } 79 } 80 printf("Case %d: %d ",j++,m); 81 } 82 return 0; 83 }