【bzoj2823】【AHOI2012】【信号塔】【随机增量法】
来源:互联网 发布:影音先锋怎么恢复数据 编辑:程序博客网 时间:2024/06/06 20:45
Description
在野外训练中,为了确保每位参加集训的成员安全,实时的掌握和收集周边环境和队员信息非常重要,集训队采用的方式是在训练所在地散布N个小型传感器来收集并传递信息,这些传感器只与设在集训地中的信号塔进行通信,信号塔接收信号的覆盖范围是圆形,可以接收到所有分布在该集训区域内所有N个小型传感器(包括在该圆形的边上)发出的信号。信号塔的功率与信号塔接收范围半径的大小成正比,因为是野外训练,只能使用事先储备好的蓄电设备,因此在可以收集所有传感器信息的基础上,还应使得信号塔的功率最小。小龙帮助教官确定了一种信号塔设置的方案,既可以收集到所有N个传感器的信号,又可以保证这个信号塔的功率是最小的。同学们,你们知道,这个信号塔的信号收集半径有多大,它应该设置在何处吗?
Input
共N+1行,第一行为正整数N(1≤N≤1000000),表示队员个数。接下来
N行,每行两个实数用空格分开,分别是第i个队员的坐标X
Output
一行,共三个实数(中间用空格隔开),分别是信号塔的坐标,和信号塔 覆盖的半径。 (注:队员是否在边界上的判断应符合他到圆心的距离与信号塔接收半径之差的绝对值小于10^-6
Sample Input
5
1.200 1.200
2.400 2.400
3.800 4.500
2.500 3.100
3.900 1.300
1.200 1.200
2.400 2.400
3.800 4.500
2.500 3.100
3.900 1.300
Sample Output
2.50 2.85 2.10
HINT
1≤N≤500000
题解:最小圆覆盖裸题。
具体就是使用随机增量法。自行百度吧。
代码:
#include<iostream>#include<cstdio>#include<cmath>#define N 500010#define eps 1e-8using namespace std;struct use{double x,y;}p[N];struct cc{use c;double r;}ans;int n;double po(double x){return x*x;}double dis(use a,use b){return sqrt(po(a.x-b.x)+po(a.y-b.y));}bool check(double x,double y){ if (x-y>eps) return true; if (x-y<-eps) return false;}use cal(use a,use b,use c){ double bx=b.x-a.x,by=b.y-a.y; double cx=c.x-a.x,cy=c.y-a.y; double d=2.0*(bx*cy-by*cx); double x=(cy*(bx*bx+by*by)-by*(cx*cx+cy*cy))/d+a.x; double y=(bx*(cx*cx+cy*cy)-cx*(bx*bx+by*by))/d+a.y; return use{x,y};}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); ans.c.x=p[1].x;ans.c.y=p[1].y;ans.r=0; for (int i=1;i<=n;i++) if (check(dis(ans.c,p[i]),ans.r)){ ans.c=p[i],ans.r=0; for (int j=1;j<i;j++) if (check(dis(ans.c,p[j]),ans.r)){ ans=cc{use{(p[i].x+p[j].x)*0.5,(p[i].y+p[j].y)*0.5},dis(p[i],p[j])*0.5}; for (int k=1;k<j;k++) if (check(dis(ans.c,p[k]),ans.r)){ use t=cal(p[i],p[j],p[k]); ans.c=t;ans.r=dis(p[i],t); } } } printf("%.2lf %.2lf %.2lf\n",ans.c.x,ans.c.y,ans.r);}
0 0
- 【bzoj2823】【AHOI2012】【信号塔】【随机增量法】
- 【AHOI2012】【BZOJ2823】信号塔
- bzoj2823[AHOI2012]信号塔
- [BZOJ2823][AHOI2012]信号塔
- bzoj2823: [AHOI2012]信号塔
- bzoj2823【AHOI2012】信号塔
- bzoj2823: [AHOI2012]信号塔
- bzoj2823: [AHOI2012]信号塔
- bzoj2823 信号塔 随机增量算法
- 【bzoj2823】 AHOI2012—信号塔
- BZOJ 2823: [AHOI2012]信号塔 随机增量法
- 【BZOJ 2823】[AHOI2012]信号塔 随机增量
- 【BZOJ2823】【AHOI2012】信号塔 最小圆覆盖 计算几何
- [随机增量法 最小圆覆盖] BZOJ 1366 [Balkan2002]Alien最小圆覆盖 & 1337 最小圆覆盖 & 2823 [AHOI2012]信号塔
- bzoj 2823 信号塔|计算几何|随机增量法
- 【BZOJ 2823】 [AHOI2012]信号塔
- BZOJ 2823 AHOI2012 信号塔 计算几何
- BZOJ 3564 SHOI2014 信号增幅仪 随机增量法
- Java类的生命周期
- uboot compile error with linaro gcc
- 京东金融
- 即时通讯三大框架
- tests or sets bit of a u8 type array
- 【bzoj2823】【AHOI2012】【信号塔】【随机增量法】
- RecyclerView使用详解(一)
- 深入理解JavaScript的原型和原型链
- Backbone.js 的技巧和模式
- Keil MDK 5代码补全功能设置
- JSP转译为Servlet错误可能发生的3个时候
- SASS用法指南
- 【bzoj2241】【sdoi2011】【打地鼠】【暴力】
- 【算法】Harris角点算法matlab程序