P1742 最小圆覆盖
\(\color{#0066ff}{题目描述}\)
给出N个点,让你画一个最小的包含所有点的圆。
\(\color{#0066ff}{输入格式}\)
先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)
\(\color{#0066ff}{输出格式}\)
输出圆的半径,及圆心的坐标,保留10位小数
\(\color{#0066ff}{输入样例}\)
6
8.0 9.0
4.0 7.5
1.0 2.0
5.1 8.7
9.0 2.0
4.5 1.0
\(\color{#0066ff}{输出样例}\)
5.0000000000
5.0000000000 5.0000000000
\(\color{#0066ff}{数据范围与提示}\)
none
\(\color{#0066ff}{题解}\)
随机增量法
前置知识,三点定圆
设圆上有三个点\(A(x_1, y_1), B(x_2, y_2), C(x_3, y_3)\)
我们可以找这些点的连线的任两条线,找它们垂直平分线的交点就是圆心
易得向量(线段)AB,BC
设两条线段的垂直平分线为\(A_1x+B_1y=C_1,A_2x+B_2y=C_2\)
上式的A和B分别是两个向量的x和y(法向量(可以带入验证))
之后带入AB,BC的中点来求出两个C
联立两个垂直平分线,解出来
\(x=\frac{C_2*B_1-C_1*B_2}{A_2*B_1-A_1*B_2}, y=\frac{C_2*A_1-C_1*A_2}{B_2*A_1-B_1*A_2}\)
有了圆心,半径自然好求,随便找圆上一点(A,B,C)与圆心求距离就是半径了
随机增量
初始设置第一个点为圆心,半径为0
依次扫每个点,如果不在当前圆内,则以那个点为圆心
再次扫从头开始到当前的每个点,如果不在当前圆中
则当前点与那个点作为新圆直径,构成当前圆,再次扫到当前每个点
如果仍有不在圆内的,三点定圆
#include <bits/stdc++.h>
#define _ 0
#define LL long long
inline LL in() {
	LL x = 0, f = 1; char ch;
	while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
	while(isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
	return x * f;
}
const int maxn = 1e5 + 10;
const double eps = 1e-14;
struct node {
	double x, y;
	node(double x = 0, double y = 0)
		:x(x), y(y) {}
	double mod() {
		return sqrt(x * x + y * y);
	}
	friend node operator - (const node &a, const node &b) {
		return node(a.x - b.x, a.y - b.y);
	}
	friend node operator + (const node &a, const node &b) {
		return node((a.x + b.x) / 2.0, (a.y + b.y) / 2.0);
	}
}e[maxn];
int n;
void circle(node a, node b, node c, node &o, double &r) {
	node ab = b - a, bc = c - b, mid1 = a + b, mid2 = b + c;
	double A1 = ab.x, B1 = ab.y, A2 = bc.x, B2 = bc.y;
	double C1 = A1 * mid1.x + B1 * mid1.y, C2 = A2 * mid2.x + B2 * mid2.y;
	o = node((C2 * B1 - C1 * B2) / (A2 * B1 - A1 * B2), (C2 * A1 - C1 * A2) / (B2 * A1 - B1 * A2));r = (o - a).mod();
}
void work() {
	node o = e[1];
	double r = 0;
	for(int i = 2; i <= n; i++)
		if((e[i] - o).mod() - r > eps) {
			o = e[i], r = 0;
			for(int j = 1; j <= i - 1; j++)
				if((e[j] - o).mod() - r > eps) {
					o = e[i] + e[j];
					r = (o - e[i]).mod();
					for(int k = 1; k <= j - 1; k++)
						if((e[k] - o).mod() - r > eps)
							circle(e[i], e[j], e[k], o, r);
				}
		}
	printf("%.10f\n%.10f %.10f", r, o.x, o.y);
}
int main() {
	n = in();
	for(int i = 1; i <= n; i++) scanf("%lf%lf", &e[i].x, &e[i].y);
	work();
	return 0;
}
												
											P1742 最小圆覆盖的更多相关文章
- 洛谷 P1742 最小圆覆盖 (随机增量)
		
题目链接:P1742 最小圆覆盖 题意 给出 N 个点,求最小的包含所有点的圆. 思路 随机增量 最小圆覆盖一般有两种做法:随机增量和模拟退火.随机增量的精确度更高,这里介绍随机增量的做法. 先将所有 ...
 - 洛谷P1742 最小圆覆盖(计算几何)
		
题面 传送门 题解 之前只是在抄题解--这篇才算是真正自己想的吧-- 首先我们把输入序列给\(random\)一下防止出题人好心送你一个毒瘤序列 我们设\(r\)为当前最大半径,\(o\)为此时对应圆 ...
 - (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)
		
bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...
 - P1742 最小圆覆盖(计算几何)
		
体验过\(O(n^3)\)过\(10^5\)吗?快来体验一波当\(wys\)的快感吧\(QAQ\) 前置芝士1:二元一次方程组求解 设 \[\begin{cases}a1 * x + b1*y=c1\ ...
 - 洛谷P1742 最小圆覆盖(计算几何)
		
题意 题目链接 Sol 暴力做法是\(O(n^3)\)枚举三个点然后check一下是否能包含所有点 考虑一种随机算法,首先把序列random_shuffle一下. 然后我们枚举一个点\(i\),并维护 ...
 - 最小圆覆盖(洛谷 P1742   增量法)
		
题意:给定N个点,求最小圆覆盖的圆心喝半径.保留10位小数点. N<1e5: 思路:因为精度要求较高,而且N比较大,所以三分套三分的复杂度耶比较高,而且容易出错. 然是写下增量法吧. 伪代码加深 ...
 - 【BZOJ-1336&1337】Alie最小圆覆盖         最小圆覆盖(随机增量法)
		
1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1573 ...
 - Bzoj 1336&1337 Alien最小圆覆盖
		
1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec Memory Limit: 162 MBSec Special Judge Submit: 1473 ...
 - hdu3007Buried memory(最小圆覆盖)
		
链接 普通的暴力复杂度达到O(n^4),对于这题肯定是不行的. 解法:随机增量算法 参考http://www.2cto.com/kf/201208/149602.html algorithm:A.令C ...
 
随机推荐
- java selenium webdriver第一讲 seleniumIDE
			
Selenium是ThoughtWorks公司,一个名为Jason Huggins的测试为了减少手工测试的工作量,自己实现的一套基于Javascript语言的代码库 使用这套库可以进行页面的交互操作, ...
 - IT求职经验分享
			
本来这些东西应该早点写出来,之前由于一些事情的顾虑迟迟没有发表下笔整理并发表出来.最近及接下来的日子是校招找工作的关键时期,结合自己之前找暑期实习的过程及笔试面试经历(主要是三家,腾讯.360.绿盟科 ...
 - Plist文件存储
			
一.Plilst存储简介 (1)只能储存NSData.NSNumber.NSDictionary.NSString.NSDate.NSArray.BOOL等数据类型,如果需要存储其他NSObject类 ...
 - App启动原理和启动过程
			
一.程序启动原理 1.1.main函数中执行了一个UIApplicationMain这个函数UIApplicationMain(int argc, char *argv[], NSString ...
 - mui封装的ajax请求
			
由于项目中引进MUI框架,所以就不需要引进jquery,但需要和后台交互时,常写为jquery格式:所以笔者觉得有必要将mui封装的ajax请求在这里提一下: 1,mui框架基于htm5plus的XM ...
 - to_date() 、to_char()、to_number的FMT格式
			
元素 含义 结果:2018/01/12(周五) - / , . ; : (6中不同分隔符) 分隔符 y 显示一位年份 8 yy 显示二位年 ...
 - CentOS 7 下设置DNS
			
在CentOS 7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.和CentOS 6下的设置DNS方法不同,有几种方式: 1.使用全新的命令行工具 ...
 - git 本地代码到github(转)
			
git 本地代码到github 一·什么是gitHub? 官网解释:gitHub是一个让无论处于何地的代码工作者能工作于同一个项目,同一个版本的平台.(GitHub is a code hosti ...
 - Ros学习——Python发布器publisher和订阅器subscriber
			
1.编写发布器 初始化 ROS 系统 在 ROS 网络内广播我们将要在 chatter 话题上发布 std_msgs/String 类型的消息 以每秒 10 次的频率在 chatter 上发布消息 在 ...
 - return()函数
			
在函数中,执行完return()函数后,下面的语句就不会再执行了.例子: <?php function fn() { echo "you are awsome"; retur ...