poj1328 Radar Installation
第一篇博客~
题意:有一条海岸线,还上有n个岛屿,雷达的探测范围是以d为半径的圆,当岛屿与雷达之间的距离小于等于d时则岛屿可以被探测到,在海岸线上建立尽可能少的雷达,并且每一个岛屿都必须能够被探测到。如果某个岛屿永远无法被探测到的情况输出-1。
贪心算法,先把每个岛屿对应圆心在x轴上的范围也就是求出每个岛屿能够被探测到的雷达建设范围,记录范围的左端与右端(要用double型),之后对每个岛屿的雷达建设范围的左端进行从小到大排序(排序时注意浮点型qsort排序),排序完成后就可以看成找尽可能少的点使所有的区段都能包含至少一个这样的点。
AC代码:

1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<math.h> 5 #include<algorithm> 6 using namespace std; 7 struct node 8 { 9 double left; 10 double right; 11 }; 12 struct node coor[1005]; 13 int cmp(const void *a,const void *b) 14 { 15 return (*(node*)a).left>=(*(node*)b).left?1:-1;/*这里注意浮点型的排序返回不能用a-b形式的*/ 16 } 17 int main() 18 { 19 int n,d,i,x,y,t=0,num,fail; 20 double j,std; 21 while(scanf("%d%d",&n,&d)!=EOF&&(n||d)) 22 { 23 fail=0; 24 t++; 25 num=1; 26 for(i=0;i<n;i++) 27 { 28 scanf("%d%d",&x,&y); 29 if(y>d)/*当某一个岛屿的纵坐标超出探测范围,则这个岛屿无论如何都无法被探测到*/ 30 fail=1; 31 else 32 { 33 /*计算雷达建设范围*/ 34 j=sqrt((double)(d*d-y*y)); 35 coor[i].left=x-j; 36 coor[i].right=x+j; 37 } 38 } 39 if(fail) 40 { 41 printf("Case %d: -1\n",t); 42 } 43 else 44 { 45 qsort(coor,n,sizeof(node),cmp); 46 std=coor[0].right;/*以最左端的一个雷达建设范围的右端为参考值*/ 47 for(i=1;i<n;i++) 48 { 49 if(coor[i].left>std)/*当某一个雷达建设范围的左端超出参考值,说明这个范围对应的 50 岛屿与前面的岛屿不能公用一个雷达,num++,并且更新参考值为该雷达建设范围的右端*/ 51 { 52 num++; 53 std=coor[i].right; 54 } 55 else if(coor[i].right<std)/*当某一雷达建设范围的右端小于参考值时说明这个雷达建设 56 范围是套在参考值对应的雷达建设范围内的,为保证此雷达建设范围对应的岛屿可被探测, 57 参考值应更新为此雷达建设范围的右端*/ 58 { 59 std=coor[i].right; 60 } 61 } 62 printf("Case %d: %d\n", t, num); 63 } 64 } 65 return 0; 66 }
作者: 点A点C
出处: http://www.cnblogs.com/ACshasow/>
关于作者:游戏开发、算法研究,请多多赐教!
本文版权归作者(点A点C)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(572779130@qq.com)咨询.