标签:style blog class code c tar
题目大意:
X轴为陆地,X轴上方为大海,海中有多个小岛,坐标为(x,y)。给你任意多个雷达,雷达的扫描范围i是一个以半径为D的圆,问你至少用几个雷达可以将所有小岛覆盖。如不能完全覆盖输出“-1”。
解题思路:
简单贪心。以每个小岛为圆心作以半径为D的圆,找出与X轴相交的区间,意思为在这个区间上的任意一点都可以作为圆心,包含这个小岛。 这时就需要把所有小岛的在X轴的区间找到。 有交集的部分说明可以用一个圆覆盖。这是算出最小的圆, 先排序,排序之后找到最左边小岛的的右区间,然后看每一个小岛的左区间是否比右区间小,如果小的话,说明有交集,就可以用一个圆来覆盖。
代码:
1 #include<cstdio> 2 #include<math.h> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 7 using namespace std; 8 9 struct Node 10 { 11 double x,y; 12 }; 13 Node node[2000]; 14 15 Node x[2000]; 16 double cmp(Node a,Node b) 17 { 18 return a.y<b.y; 19 } 20 int main() 21 { 22 int n; 23 double d; 24 int cas=1; 25 while(scanf("%d%lf",&n,&d)!=EOF) 26 { 27 if (d==0&&n==0) 28 break; 29 int i,j; 30 int ce=0; 31 for(i=0; i<n; i++) 32 { 33 scanf("%lf%lf",&node[i].x,&node[i].y); 34 if (node[i].y>d) 35 ce=1; 36 } 37 printf("Case %d: ",cas++); 38 if (ce) 39 { 40 printf("-1\n"); 41 continue; 42 } 43 double c; 44 int flag=0; 45 for(i=0; i<n; i++) 46 { 47 c=d*d-node[i].y*node[i].y; 48 c=sqrt(c); 49 x[i].x=node[i].x-c; 50 x[i].y=node[i].x+c; 51 } 52 sort(x,x+n,cmp); 53 double k=0; 54 int sum=1; 55 k=x[0].y; 56 for(j=1; j<n; j++) 57 { 58 if (k<x[j].x) 59 { 60 sum++; 61 k=x[j].y; 62 } 63 } 64 printf("%d\n",sum); 65 } 66 return 0; 67 }
poj1328(Radar Installation),布布扣,bubuko.com
标签:style blog class code c tar
原文地址:http://www.cnblogs.com/ZhaoPengkinghold/p/3735093.html