标签:
解题思路:给出n个岛屿,n个岛屿的坐标分别为(a1,b1),(a2,b2)-----(an,bn),雷达的覆盖半径为r
求所有的岛屿都被覆盖所需要的最少的雷达数目。
首先将岛屿坐标进行处理,因为雷达的位置在x轴上,所以我们设雷达的坐标为(x,0),对于任意一个岛屿p(a,b),因为岛屿要满足在雷达的覆盖范围内,所以 (x-a)^2+b^2=r^2,解得
xmin=a-sqrt(r*r-b*b);//即为区间的左端点 xmax=a+sqrt(r*r-b*b);//即为区间的右端点
接下来区间选点即可
------------------------------tmp
1 a[i]----------------------------b[i]
2 a[i]--------b[i]
3 a[i]-------------------- b[i]
用tmp记录当前雷达坐标,将区间按左端点升序排序后,从左到右扫描,会出现 以上3种情况
1 当前tmp<a[i],雷达无法覆盖到下一个区间,所以增加一个新的雷达,同时更新雷达的坐标为该区间的右端点(贪心,在越右边,越有可能覆盖到下一个区间),即为tmp=b[i]
2 当前b[i]<tmp,雷达无法覆盖该区间,但是该区间被包含在tmp所在区间内,所以不需要增加雷达,更新tmp的值即可 tmp=b[i]
3 该区间被雷达覆盖,不做处理。
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 55518 | Accepted: 12502 |
Description
Input
Output
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
#include<stdio.h> #include<string.h> #include<math.h> double a[1005],b[1005]; void bubblesort(double a[],double b[],int n) { int i,j; double t; for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; t=b[i]; b[i]=b[j]; b[j]=t; } } } } int main() { int n,i,sum,flag,tag=0; double x,y,r,tmp; flag=1; while(scanf("%d %lf",&n,&r)!=EOF&&(n||r)) { tag=0; for(i=1;i<=n;i++) { scanf("%lf %lf",&x,&y); if(r>=fabs(y)) { a[i]=x-sqrt(r*r-y*y); b[i]=x+sqrt(r*r-y*y); } else tag=1; } if(tag)//不考虑r<0的情况也能通过 printf("Case %d: -1\n",flag++); else { bubblesort(a,b,n); sum=1; tmp=b[1]; for(i=2;i<=n;i++) { if(a[i]>tmp) { tmp=b[i]; sum++; } else if(b[i]<tmp) tmp=b[i]; } printf("Case %d: %d\n",flag++,sum); } } }
POJ 1328 Radar Installation 【贪心 区间选点】
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4189541.html