P1742 最小圆覆盖(计算几何)】的更多相关文章

题意 题目链接 Sol 暴力做法是\(O(n^3)\)枚举三个点然后check一下是否能包含所有点 考虑一种随机算法,首先把序列random_shuffle一下. 然后我们枚举一个点\(i\),并维护一个当前的圆. 再枚举一个点\(j\),如果该点在圆内继续,否则用\(i, j\)构造出的圆替换出之前的圆. 再枚举一个点\(k\),如果该点在圆内继续,否则用\(i, j, k\)构造出一个新的圆. 这样的期望复杂度是O(n)的(不会证) 一开始我以为这样做的正确性有点问题,也就是说可能找到一个不…
题目链接:P1742 最小圆覆盖 题意 给出 N 个点,求最小的包含所有点的圆. 思路 随机增量 最小圆覆盖一般有两种做法:随机增量和模拟退火.随机增量的精确度更高,这里介绍随机增量的做法. 先将所有点随机打乱. 令前 \(i - 1\) 个点的最小覆盖圆为圆 \(O\),加入第 \(i\) 个点. 如果第 \(i\) 个点在圆 \(O\) 内或圆 \(O\) 上,则前 \(i\) 个点的最小覆盖圆还是圆 \(O\). 否则新得到的最小覆盖圆肯定经过第 \(i\) 个点.然后确定前 \(i −…
题面 传送门 题解 之前只是在抄题解--这篇才算是真正自己想的吧-- 首先我们把输入序列给\(random\)一下防止出题人好心送你一个毒瘤序列 我们设\(r\)为当前最大半径,\(o\)为此时对应圆心 先说一下算法过程: 令前\(i-1\)个点的最小覆盖圆为\((o,r)\) 如果第\(i\)个点在这个圆中,直接跳过 如果不在,那么第\(i\)个点一定在前\(i\)个点的最小覆盖圆上,此时前\(i-1\)个点中还有两个也在最小覆盖圆上.那么我们设\(o=p_i,r=0\),做固定了第\(i\)…
体验过\(O(n^3)\)过\(10^5\)吗?快来体验一波当\(wys\)的快感吧\(QAQ\) 前置芝士1:二元一次方程组求解 设 \[\begin{cases}a1 * x + b1*y=c1\\a2 * x + b2*y=c2\end{cases}\] (其中\(a1,a2,b1,b2,c1,c2\)为已知量) 由\(②\)式得: \[x=\frac{c2-b2*y}{a2}\] 带入\(①\)式并化简得: \[y=\frac{c1-\frac{a1*c2}{a2}}{b1-\frac{…
bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可以发现:1.g(A)是唯一的2.g(A)可以由<=3个点唯一确定①由一个点确定(所有点重合时)②由两个点确定(圆直径必定为两点连线)③由三个点确定(圆必定是过三点的唯一圆) 把A中在g(A)上的点叫做关键点可以发现:若点b不在g(A)内(b不属于A),则b是g(A+b)的关键点证明:如果b不是g(A…
\(\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…
思路: 随机增量法 (好吧这数据范围并不用) //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> using namespace std; typedef double db; int n; ],ans; P operator-(P a,P b){return P(a.x-b.x,a.y-b.y);} db dis(P a){return sqrt(a.x*a.x+a.y*a.y)…
题意:给定N个点,求最小圆覆盖的圆心喝半径.保留10位小数点. N<1e5: 思路:因为精度要求较高,而且N比较大,所以三分套三分的复杂度耶比较高,而且容易出错. 然是写下增量法吧. 伪代码加深记忆: 圆 C; to n) { if(P[i] 不在 C 内) { C = {P[i], }; to i-) { if(P[j] 不在 C 内) { C = {0.5*(P[i]+P[j]), 0.5*dist(P[i], P[j])}; to j-) { if(P[k] 不在 C 内) { C = 外…
传送门 省选考最小圆覆盖? 亦可赛艇(你们什么都没看见) 在大佬的引领下成功做了出来. 就是旋转坐标使椭圆的横轴跟xxx轴平行. 然后压缩横坐标使得其变成一个圆. 然后跑最小覆盖圆就可以了. 注意题目给的是角度233. 代码里有其他计算几何的板子. 代码: #include<bits/stdc++.h> #define db double #define N 50005 using namespace std; const double pi=acos(-1.0); struct pot{db…
1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1573  Solved: 697[Submit][Status][Discuss] Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0) Outpu…