1337: 最小圆覆盖

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 1170  Solved: 573
[Submit][Status][Discuss]

Description

给出平面上N个点,N<=10^5.请求出一个半径最小的圆覆盖住所有的点

Input

第一行给出数字N,现在N行,每行两个实数x,y表示其坐标.

Output

输出最小半径,输出保留三位小数.

Sample Input

4
1 0
0 1
0 -1
-1 0

Sample Output

1.000

题目:求出n个点的最小圆覆盖

随机增量法:

①将数组重新打乱(random_shuffle()函数)

②假设已经求出了前i个点的最小圆覆盖为Ci,检查第i+1个点是否在圆内,如果在,则C(i+1)=Ci并继续判定下一个点,不在的话,就令C(i+1)的圆心为第1个点和第i+1个点连线的中点,半径为连线长度的一半,并执行步骤③

③重新检查前i个点是否在圆C(i+1)上,如果某个点j不在,就用类似步骤②的方法继续修改圆心和半径使得j点在圆C(i+1)上,并执行步骤④

④再来一次一模一样的检查过程,不过这次只要有点k不在圆上,就令圆C(i+1)的圆心为三角形(i, j, k)的外心并扩增圆C(i+1)的半径

搞定,复杂度O(n^3)不过平均复杂度只有O(n),证明略,应该很容易找到证明

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
typedef struct Point
{double x;double y;
}Point;
Point s[100005];
Point operator + (const Point a, const Point b)
{  Point k;k.x = a.x+b.x, k.y = a.y+b.y;return k;
}
Point operator - (const Point a, const Point b)
{Point k;k.x = a.x-b.x, k.y = a.y-b.y;return k;
}
Point operator / (const Point a, double x)
{Point k;k.x = a.x/x, k.y = a.y/x;return k;
}
Point operator * (const Point a, double x)
{Point k;k.x = a.x*x, k.y = a.y*x;return k;
}double Dist(Point a, Point b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
Point Waixin(Point a, Point b, Point c)     //求三角形外接圆圆心(外心)
{Point ans;double a1, a2, b1, b2, c1, c2;a1 = 2*(b.x-a.x), b1 = 2*(b.y-a.y); c1 = (b.x*b.x)-(a.x*a.x)+(b.y*b.y)-(a.y*a.y);a2 = 2*(c.x-a.x), b2 = 2*(c.y-a.y); c2 = (c.x*c.x)-(a.x*a.x)+(c.y*c.y)-(a.y*a.y);if(fabs(a1)<eps)ans.y = c1/b1, ans.x = (c2-ans.y*b2)/a2;else if(fabs(b1)<eps)ans.x = c1/a1, ans.y = (c2-ans.x*a2)/b2;elseans.x = (c2*b1-c1*b2)/(a2*b1-a1*b2), ans.y = (c2*a1-c1*a2)/(b2*a1-b1*a2);return ans;
}
int main(void)
{Point P;double R;int n, i, j, k;scanf("%d", &n);for(i=1;i<=n;i++)scanf("%lf%lf", &s[i].x, &s[i].y);random_shuffle(s+1, s+n+1);P = s[1], R = 0;for(i=2;i<=n;i++){if(Dist(P, s[i])-R>eps){P = (s[1]+s[i])/2;R = Dist(P, s[i]);for(j=2;j<=i-1;j++){if(Dist(P, s[j])-R>eps){P = (s[i]+s[j])/2;R = Dist(P, s[i]);for(k=1;k<=j-1;k++){if(Dist(P, s[k])-R>eps){P = Waixin(s[i], s[j], s[k]);R = Dist(P, s[i]);}}}}}}printf("%.3f\n", R);return 0;
}

随机增量法:bzoj 1336 bzoj 1337 最小圆覆盖相关推荐

  1. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)

    如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...

  2. matlab模拟退火最小球覆盖,最小圆覆盖最小球覆盖 (增量法和模拟退火法)

    这种题几乎一套板子走天下. 昨天做最小圆覆盖用的都是增量法,压根没看过退火模拟法,因为退火模拟法并不是很稳定.今天看最小球覆盖时发现用到了退火模拟法,于是看了看最小圆覆盖的退火模拟法,用退火板子提交直 ...

  3. bzoj 2654 bzoj 3675 总结

    bzoj 2654 && bzoj 3675 总结 手动博客搬家: 本文发表于20180929 15:18:55, 原地址https://blog.csdn.net/suncongbo ...

  4. 文献记录(part68)--K- 近邻分类器鲁棒性验证:从约束放松法到随机平滑法

    学习笔记,仅供参考,有错必纠 关键词:监督学习 , 对抗机器学习 , 对抗鲁棒性 , 鲁棒性验证 , K- 近邻分类器 K- 近邻分类器鲁棒性验证:从约束放松法到随机平滑法 摘要 本文研究 K- 近邻 ...

  5. 电导增量法matlab,基于变步长电导增量法MPPT研究.doc

    基于变步长电导增量法MPPT研究 基于变步长电导增量法MPPT研究 [摘要]光伏电池的输出功率与太阳辐射和环境温度变化,若不加以控制,将不会以最大功率输出.本文提出了一种变步长电导增量法,在光伏发电系 ...

  6. 创建数组-直接法/增量法 namelengthmax isvarname iskeyword

    立即学习:https://edu.csdn.net/course/play/24708/278792?utm_source=blogtoedu 直接构造法 1 行向量A=[1 2 3 4 5] 2 列 ...

  7. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 959  Solved: 489 [Submit][Statu ...

  8. Random Projection 随机投影法

    Random Projection 随机投影法 Hercht-Neilseon: 简单的说就是当一个随机矩阵维数到达一定程度的时候,其转置和自身正交. J-L引理: 在高维空间中的点可以被线性地嵌入到 ...

  9. 线性与非线性规划:随机方向法

    文章目录 前言 一.随机方向法 二.算法实现 1.算法步骤 2.算法细节 3.代码示例 4.示例 总结 前言 本系列涉及线性与非线性规划中的几种规划算法 1.本节介绍随机方向法 2.参考:陈宝林-最优 ...

最新文章

  1. ubuntu 下 SubLime Text2 使用之创建快捷方式
  2. 京东618:六年历程步步为营,京东商城的安全保卫战
  3. 算法杂货铺——k均值聚类(K-means)
  4. boost::mp11::mp_any_of_q相关用法的测试程序
  5. wordl流程图怎么写字_DLG的制作流程图
  6. linux——进程(创建、终止、等待、替换)
  7. Qt文档阅读笔记-Qt单元测试中模拟GUI事件
  8. Nova: 虚机的块设备总结 [Nova Instance Block Device]
  9. Eclipse下搭建Android的NDK开发环境
  10. COCOS2D-X之圆形进度条的一个简单Demo
  11. Windows系统历史版本简介
  12. 第二届广东省大学生网络攻防大赛 simple_re
  13. php 上传图片后反转,PHP想象将图像从CMYK转换为RGB反转图像
  14. 商业的本质 + 社交电商思考
  15. TPshop学习(1)Windows下安装TPshop
  16. 计算机控制台win10,Win10系统打开Windows控制台的方法
  17. shell脚本监控网站是否正常
  18. Matlab 计算显色指数(Ra,R1-R15)、CCT、duv、Lux、XYZ三刺激值、CIE1931x、CIE1931y
  19. 【IT实施培训那些事儿】
  20. 图像加权和制作鬼影---OpenCV-Python开发指南(2)

热门文章

  1. python能自学成功吗-想自学Python,如何才能坚持下来?
  2. 小学生python编程教程-围观~山东省的小学生Python编程入门都学的什么?
  3. python基础代码大全-【01】Python基础入门 (全)
  4. python能做什么项目-这十个Python实战项目,让你瞬间读懂Python!
  5. python发音-Python如何实现文本转语音
  6. 普通人学python有啥用-普通人为什么要学习Python
  7. 科学网—中文普通话语音识别DEMO,LilyMandarinSpeechRecognition V1.0 - 石自强的博文...
  8. lync显示无法找到服务器,Lync 2013 已知问题
  9. vue项目中使用lib-flexible解决移动端适配
  10. 【Redis笔记】数据结构和对象:字典