题意

题目链接

Sol

暴力做法是\(O(n^3)\)枚举三个点然后check一下是否能包含所有点

考虑一种随机算法,首先把序列random_shuffle一下。

然后我们枚举一个点\(i\),并维护一个当前的圆。

再枚举一个点\(j\),如果该点在圆内继续,否则用\(i, j\)构造出的圆替换出之前的圆。

再枚举一个点\(k\),如果该点在圆内继续,否则用\(i, j, k\)构造出一个新的圆。

这样的期望复杂度是O(n)的(不会证)

一开始我以为这样做的正确性有点问题,也就是说可能找到一个不优的解。但是显然是不对的,因为如果有更优的解且面积比当前小的话,这个解最起码要包含当前的不优解的三个点,是矛盾的。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int N;
double R;
struct Point {
double x, y;
}p[MAXN], C;
double sqr(double x) {
return x * x;
}
double dis(Point a, Point b) {
return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));
}
void MakeC(Point p1, Point p2, Point p3) {
double a = p2.x - p1.x,
b = p2.y - p1.y,
c = p3.x - p1.x,
d = p3.y - p1.y,
e = (sqr(p2.x) - sqr(p1.x) + sqr(p2.y) - sqr(p1.y)) / 2,
f = (sqr(p3.x) - sqr(p1.x) + sqr(p3.y) - sqr(p1.y)) / 2;
C.x = (e * d - b * f) / (a * d - b * c);
C.y = (a * f - e * c) / (a * d - b * c);
R = dis(C, p1);
}
int main() {
cin >> N;
for(int i = 1; i <= N; i++) scanf("%lf %lf", &p[i].x, &p[i].y);
random_shuffle(p + 1, p + N + 1);
for(int i = 1; i <= N; i++) {
if(dis(p[i], C) < R) continue;
C = p[i]; R = 0;
for(int j = 1; j <= i - 1; j++) {
if(dis(p[j], C) < R) continue;
C.x = (p[i].x + p[j].x) / 2.0;
C.y = (p[i].y + p[j].y) / 2.0;
R = dis(C, p[j]);
for(int k = 1; k <= j - 1; k++) {
if(dis(p[k], C) < R) continue;
MakeC(p[i], p[j], p[k]);
}
}
}
printf("%.10lf\n", R);
printf("%.10lf %.10lf", C.x, C.y);
return 0;
}

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

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

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

  2. 洛谷 P1742 最小圆覆盖 (随机增量)

    题目链接:P1742 最小圆覆盖 题意 给出 N 个点,求最小的包含所有点的圆. 思路 随机增量 最小圆覆盖一般有两种做法:随机增量和模拟退火.随机增量的精确度更高,这里介绍随机增量的做法. 先将所有 ...

  3. 洛谷P1742 最小圆覆盖(计算几何)

    题面 传送门 题解 之前只是在抄题解--这篇才算是真正自己想的吧-- 首先我们把输入序列给\(random\)一下防止出题人好心送你一个毒瘤序列 我们设\(r\)为当前最大半径,\(o\)为此时对应圆 ...

  4. 最小圆覆盖(洛谷 P1742 增量法)

    题意:给定N个点,求最小圆覆盖的圆心喝半径.保留10位小数点. N<1e5: 思路:因为精度要求较高,而且N比较大,所以三分套三分的复杂度耶比较高,而且容易出错. 然是写下增量法吧. 伪代码加深 ...

  5. 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)

    洛谷题目传送门 CF题目传送门 对于这题,我无力吐槽. 虽然式子还是不难想,做法也随便口胡,但是一些鬼畜边界情况就是判不对. 首先显然二分答案. 对于每一个雨滴,它出现的时刻我们的绳子必须落在它上面. ...

  6. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

  7. 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)

    洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...

  8. P1742 最小圆覆盖(计算几何)

    体验过\(O(n^3)\)过\(10^5\)吗?快来体验一波当\(wys\)的快感吧\(QAQ\) 前置芝士1:二元一次方程组求解 设 \[\begin{cases}a1 * x + b1*y=c1\ ...

  9. 洛谷P2764 最小路径覆盖问题

    有向无环图的最小路径点覆盖 最小路径覆盖就是给定一张DAG,要求用尽量少的不相交的简单路径,覆盖有向无环图的所有顶点. 有定理:顶点数-路径数=被覆盖的边数. 要理解的话可以从两个方向: 假设DAG已 ...

随机推荐

  1. C#+ZXing.dll生成手机路径导航二维码

    1.原谅我先写点废话哈 这两天用C#写一个C端的软件,甲方提出一个很无理的需求(在C端的程序中实现路径导航,关键是这个程序最终是运行在物理隔绝的电脑上的……),头疼了好几天,领导突然想到可以把坐标+百 ...

  2. 【Selenium专题】鼠标键盘事件

    引用包来自selenium-java-2.23.1.jar 调用以下代码时,需要引入actions类,以java为例: import org.openqa.selenium.interactions. ...

  3. 一篇入门 -- Scala

    整体介绍 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性. 联邦理工学院洛桑(EPFL)的Martin Odersky于2001 ...

  4. MySQL数值类型

    MySQL数值类型 MySQL支持所有标准的SQL数值数据类型.这些类型包括数值数据类型INTEGER.SMALLINT.DECIMAL.NUMERIC和近似数值数据类型FLOAT.REAL.DOUB ...

  5. es6中的对象的可计算的属性名

    先简单的啰嗦一下对象的属性: var obj = { a:2 } 要访问obj中a的位置,方法:1. obj.a     //2            2..obj ["a"]   ...

  6. Log4Net使用详解1

    log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQL Server, Access, Oracle ...

  7. 从零开始学 Web 之 ES6(二)ES5的一些扩展

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  8. Spring Cloud Consul使用——配置中心

    1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  9. Elasticsearch从入门到精通之Elasticsearch基本概念

    导读 在上一章节我们介绍Elasticsearch前世今生,今天我们继续进行本章内容,Elasticsearch的核心概念.从一开始就理解这些概念将极大地帮助简化学习过程. 近实时(NRT) Elas ...

  10. 如何让ajax执行完后再继续往下执行

    $.ajax加上参数async: false, false代表同步请求,true代表异步(默认)