首先我写了个凸包就溜了

这是最小圆覆盖问题,今晚学了一下

先随机化点,一个个加入

假设当前圆心为o,半径为r,加入的点为i

若i不在圆里面,令圆心为i,半径为0

再重新从1~i-1不停找j不在圆里面,令圆心为ij中点,直径为ij距离

再重新在1~j-1不停找k不在圆里面,三点可确定一圆,初中数学

复杂度看似O(n^3)实则O(n),好玄学

坑点:注意如果用点斜式表示方程有斜率为不存在的情况,需要特判

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. const double eps=1e-;
  9. double sqr(double x){return x*x;}
  10.  
  11. struct point{ double x,y;point(){} point(double X,double Y){x=X,y=Y;} };
  12. double getdis(point p1,point p2){return sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y));}
  13. point middle(point p1,point p2){return point((p1.x+p2.x)/,(p1.y+p2.y)/);}
  14. double slope (point p1,point p2)
  15. {
  16. if(p2.x==p1.x)return ;
  17. return (p2.y-p1.y)/(p2.x-p1.x);
  18. }
  19. double multi(point p1,point p2,point p0)
  20. {
  21. double x1,y1,x2,y2;
  22. x1=p1.x-p0.x;
  23. y1=p1.y-p0.y;
  24. x2=p2.x-p0.x;
  25. y2=p2.y-p0.y;
  26. return x1*y2-x2*y1;
  27. }
  28.  
  29. struct segment{ double k,b;segment(){} segment(double K,double B){k=K,b=B;} };
  30. segment getseg(double k,point pp){return segment(k,pp.y-k*pp.x);}
  31. point intersection(segment s1,segment s2)
  32. {
  33. double x=(s2.b-s1.b)/(s1.k-s2.k);
  34. double y=s1.k*x+s1.b;
  35. return point(x,y);
  36. }
  37.  
  38. //--------------------------------------simple--------------------------------------------------------
  39.  
  40. int n; point p[];
  41. bool cmp(point p1,point p2)
  42. {
  43. double d=multi(p1,p2,p[]);
  44. if(fabs(d)<=eps)return getdis(p1,p[])<getdis(p2,p[]);
  45. else return d>;
  46. }
  47. int top,sta[];
  48. void graham()
  49. {
  50. sort(p+,p+n+,cmp);
  51. top=;sta[++top]=,sta[++top]=;
  52. double g;
  53. for(int i=;i<=n;i++)
  54. {
  55. while(top>=)
  56. {
  57. g=multi(p[sta[top]],p[i],p[sta[top-]]);
  58. if(g<||fabs(g)<=eps)top--;
  59. else break;
  60. }
  61. sta[++top]=i;
  62. }
  63. }
  64.  
  65. //------------------------------------graham----------------------------------------------------------
  66.  
  67. point getcore(point p1,point p2,point p3)
  68. {
  69. double g=multi(p1,p2,p3);
  70. if(fabs(g)<=eps)
  71. {
  72. double d1=getdis(p1,p2),d2=getdis(p1,p3),d3=getdis(p2,p3);
  73. if(d1>d2&&d1>d3)return middle(p1,p2);
  74. if(d2>d1&&d2>d3)return middle(p1,p3);
  75. if(d3>d1&&d3>d2)return middle(p2,p3);
  76. }
  77. else
  78. {
  79. segment s1,s2;
  80. if(slope(p1,p2)==)
  81. {
  82. s1=getseg(-/slope(p1,p3),middle(p1,p3));
  83. s2=getseg(-/slope(p2,p3),middle(p2,p3));
  84. }
  85. else if(slope(p1,p3)==)
  86. {
  87. s1=getseg(-/slope(p1,p2),middle(p1,p2));
  88. s2=getseg(-/slope(p2,p3),middle(p2,p3));
  89. }
  90. else
  91. {
  92. s1=getseg(-/slope(p1,p2),middle(p1,p2));
  93. s2=getseg(-/slope(p1,p3),middle(p1,p3));
  94. }
  95. return intersection(s1,s2);
  96. }
  97. }
  98.  
  99. void circlecover()
  100. {
  101. random_shuffle(sta+,sta+top+);
  102. point o=p[sta[]];double r=,d;
  103. for(int i=;i<=top;i++)
  104. if(getdis(o,p[sta[i]])>r)
  105. {
  106. o=p[sta[i]],r=;
  107. for(int j=;j<i;j++)
  108. if(getdis(o,p[sta[j]])>r)
  109. {
  110. o=middle(p[sta[i]],p[sta[j]]),r=getdis(o,p[sta[i]]);
  111. for(int k=;k<j;k++)
  112. if(getdis(o,p[sta[k]])>r)
  113. o=getcore(p[sta[i]],p[sta[j]],p[sta[k]]),r=getdis(o,p[sta[i]]);
  114. }
  115. }
  116. printf("%.2lf %.2lf %.2lf\n",o.x,o.y,r);
  117. }
  118.  
  119. //------------------------------------solve----------------------------------------------------------
  120.  
  121. int main()
  122. {
  123. scanf("%d",&n);
  124. for(int i=;i<=n;i++)
  125. {
  126. scanf("%lf%lf",&p[i].x,&p[i].y);
  127. if(p[i].y<p[].y||(p[i].y==p[].y&&p[i].x<p[].x))
  128. swap(p[i],p[]);
  129. }
  130. graham();
  131. circlecover();
  132.  
  133. return ;
  134. }

bzoj2823: [AHOI2012]信号塔&&1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖的更多相关文章

  1. bzoj2823[AHOI2012]信号塔

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1190  Solved: 545[Submit][Status ...

  2. BZOJ2823 [AHOI2012]信号塔 【最小圆覆盖】

    题目链接 BZOJ2823 题解 最小圆覆盖模板 都懒得再写一次 #include<iostream> #include<cstdio> #include<cmath&g ...

  3. [日常摸鱼]bzoj2823 [AHOI2012]信号塔

    题意:$n$个点,求最小圆覆盖,$n \leq 5e5$ 这题数据是随机的hhh 我们可以先求出凸包然后对凸包上的点求最小圆覆盖-(不过直接求应该也行?) 反正随便写好像都能过- #include&l ...

  4. 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)

    [BZOJ2823][AHOI2012]信号塔(最小圆覆盖) 题面 BZOJ 洛谷 相同的题: BZOJ1 BZOJ2 洛谷 题解 模板题... #include<iostream> #i ...

  5. 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...

  6. 【bzoj2823】 AHOI2012—信号塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2823 (题目链接) 题意 求最小圆覆盖 Solution 关于最小圆覆盖的做法,论文里面都有.其实真 ...

  7. (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)

    bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...

  8. [BZOJ 1336] [Balkan2002] Alien最小圆覆盖 【随机增量法】

    题目链接:BZOJ - 1336 题目分析 最小圆覆盖有一个算法叫做随机增量法,看起来复杂度像是 O(n^3) ,但是可以证明其实平均是 O(n) 的,至于为什么我不知道= = 为什么是随机呢?因为算 ...

  9. 【BZOJ】2823: [AHOI2012]信号塔

    题意 给\(n\)个点,求一个能覆盖所有点的面积最小的圆.(\(n \le 50000\)) 分析 随机增量法 题解 理论上\(O(n^3)\)暴力,实际上加上随机化后期望是\(O(n)\)的. 算法 ...

随机推荐

  1. jenkins 提示No emails were triggered

    发送邮件 Jenkins->系统管理->系统设置,在“邮件通知”里设置smtp服务器地址,以及发送者邮箱地址,在具体的任务构建完成以后,可以设置发送邮件,在某一个任务的"Add ...

  2. 运动员最佳匹配问题(km算法)

    洛谷传送门 带权二分图最大权完美匹配. 裸的km算法. 注意开long long. #include <cstdio> #include <cstring> #include ...

  3. hdu 3879 最大权闭合图(裸题)

    /* 裸的最大权闭合图 解:参见胡波涛的<最小割模型在信息学竞赛中的应用 #include<stdio.h> #include<string.h> #include< ...

  4. Linux(1):基本配置

    linux里面的网络(网卡)配置: 1. 输出 setup 命令进行设置 2. 选择 "Network configuration" ,按 回车键 3. 选择 "Devi ...

  5. [NOIP1998] 提高组 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  6. Mongodb主、副、仲裁节点集群安装

    mongodb 的集群方式主要分为三种Replica Set / Sharding / Master-Slaver ,这里只说明最简单的集群搭建方式(生产环境),如果有多个节点可以此类推或者查看官方文 ...

  7. linux命令1——基础

    Rm 删除命令 Rm [选项][文件] 删除一个文件或者目录 选项:r 递归的删除文件夹及其子文件,f 忽略不存在的文件(不提示) (2)rm删除目录下所有文件,但不删除目录 >>rm - ...

  8. tomcat并发数

    Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的.更好的硬件,更多的处理器都会使Tomcat支持更多的并发. Tomcat默认的HTTP实现是采用阻塞式 ...

  9. Linux--进程组、会话、守护进程(转)

    http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html 进程组 一个或多个进程的集合 进程组ID: 正整数 两个函数 getpg ...

  10. hdu 3237

    dp 状态压缩 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...