标签:des c style class blog code
Radar Installation
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
题目大意:x轴上可以放置雷达(放置位置可为小数),以放置位置为圆心,d为半径做圆来覆盖岛屿,输出最小的雷达数以覆盖所有的岛屿。无法覆盖输出-1。
结题思路:假设某个岛屿的坐标为(x,y),则在(x-sqrt(d*d-y*y),x+sqrt(d*d-y*y))范围内的雷达可以覆盖到此岛屿。
先求出各个岛屿的可覆盖雷达范围,在根据其区间左端点进行排序,再通过贪心确定需要的最少雷达数。
ps:当一个岛屿的纵坐标大于d时,不可能覆盖到,输出-1。
ps2:进行贪心时,设置一个变量tmpr=p[1].r。
当p[i].r<tmpr时,tmpr=p[i].r 否则p[i]点会漏掉。
当p[i].l>tmpr是,tmpr=p[i].r,cnt++
Code:
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 struct point 6 { 7 double x,y; 8 double l,r; 9 } p[100000]; 10 bool cmp(struct point a,struct point b) 11 { 12 return a.l<b.l; 13 } 14 int main() 15 { 16 double m,d,tmpr; 17 int i,n,ok,cnt,times=0; 18 while (scanf("%d %lf",&n,&d)!=EOF) 19 { 20 times++; 21 ok=1; 22 if (n==0&&d==0) break; 23 for (i=1; i<=n; i++) 24 { 25 scanf("%lf %lf",&p[i].x,&p[i].y); 26 if (p[i].y>d) ok=0; 27 p[i].l=p[i].x-sqrt(d*d-p[i].y*p[i].y); 28 p[i].r=p[i].x+sqrt(d*d-p[i].y*p[i].y); 29 } 30 if (ok) 31 { 32 sort(p+1,p+n+1,cmp); 33 tmpr=p[1].r; 34 cnt=1; 35 for (i=2; i<=n; i++) 36 { 37 if (p[i].l>tmpr) tmpr=p[i].r,cnt++; 38 if (p[i].r<tmpr) tmpr=p[i].r; 39 } 40 printf("Case %d: %d\n",times,cnt); 41 } 42 else printf("Case %d: -1\n",times); 43 } 44 return 0; 45 }
POJ1328——Radar Installation,布布扣,bubuko.com
标签:des c style class blog code
原文地址:http://www.cnblogs.com/Enumz/p/3763071.html