题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=27586
题意:
在海岸线上摆放雷达并限定雷达覆盖半径d,再以海岸线为轴,给定海上岛屿坐标,求至少需要多少雷达可以覆盖所以岛屿,如果不能输出'-1'。
案例:
Sample Input
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
Case 1: 2
Case 2: 1
分析:
可以转换为区间覆盖问题。以岛屿为圆心,雷达扫射半径为半径,求出此圆与x轴(即海岸线)交点坐标,两交点坐标间即为雷达摆放区间(包括两交点(在此区间任意位置摆放雷达均可覆盖岛屿))。接下来即为区间覆盖求解问题了。
源代码:
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 int n,num; 6 struct former 7 { 8 double l; 9 double r; 10 }a[1005]; 11 double cmp(former m,former t)//区间排序 12 { 13 if(m.r==t.r) return m.l>t.l; 14 else 15 return m.r<t.r; 16 } 17 void change()//计算所需雷达 18 { 19 int k=0; 20 sort(a,a+n,cmp); 21 for(int j=1;j<n;j++) 22 { 23 if(a[j].l>a[k].r) 24 { 25 num++; 26 k=j; 27 } 28 } 29 } 30 int main() 31 { 32 int cnt=0; 33 double x,y,d; 34 while(scanf("%d%lf",&n,&d)&&n&&d) 35 { 36 num=1; 37 for(int i=0;i<n;i++) 38 { 39 scanf("%lf%lf",&x,&y); 40 if(d<y||d<0)//判断是否有岛屿超出雷达覆盖范围 41 num=-1; 42 a[i].l=x-sqrt(d*d-y*y);//岛屿转换可摆放雷达区间 43 a[i].r=x+sqrt(d*d-y*y); 44 } 45 if(num==-1) 46 printf("Case %d: -1 ",++cnt); 47 else 48 { 49 change(); 50 printf("Case %d: %d ",++cnt,num); 51 } 52 } 53 return 0; 54 }