【bzoj1336/1337/2823】最小圆覆盖
题目描述:
给出平面上N个点,请求出一个半径最小的圆覆盖住所有的点
输入:
第一行给出数字N,现在N行,每行两个实数x,y表示其坐标.
输出:
输出最小半径,输出保留三位小数.
样例输入:
4
1 0
0 1
0 -1
-1 0
样例输出:
1.000
题解:
随机增量法大法好呀!!!看起来是O(n^3)的算法,实际上期望是O(n)的。
具体操作如下:
(1)把点的顺序打乱,
(2)一个一个点往里面加,如果当前的点不在当前的圆内,
(3)在当前圆内的点找到另一个点,然后以这两个点做圆,
(4)再判断剩下的点,如果还有不在这个圆内的,以当前的这三个点做圆。
代码也巨好写无比,简直跟暴力一样,但是就是跑得过!!!
(唯一的难点就是推三点外接圆的式子,我这个傻逼推了一整个晚上)
代码:(以bzoj1336为例)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif #define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{
R char ch; R int cnt = 0; R bool minus = 0;
while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ? minus = 1 : cnt = ch - '0';
while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus ? -cnt : cnt;
}
inline double FastIn2()
{
R char ch = getc(); R double cnt = 0, ee = 1; R bool minus = 0, e = 0;
while (ch != '-' && (ch < '0' || ch > '9')) ch = getc();
if (ch == '-') minus = 1, ch = getc();
while (ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0' , ch = getc();
if (ch == '.') e = 1, ee *= 0.1, ch = getc();
while (ch >= '0' && ch <= '9' && e) cnt += (ch - '0') * ee, ee *= 0.1, ch = getc();
return minus ? -cnt : cnt;
}
#define maxn 1000010
struct Point
{
double x, y;
}p[maxn], o;
Point cir(Point a, Point b, Point c)
{
R Point res;
R double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1 * a1 + b1 * b1);
R double a2 = c.x - a.x, b2 = c.y - a.y, c2 = (a2 * a2 + b2 * b2);
R double d = (a2 * b1 - a1 * b2) * 2;
res.x = a.x + (c2 * b1 - c1 * b2) / d;
res.y = a.y + (c1 * a2 - c2 * a1) / d;
return res;
}
#define dist(_a, _b) (sqrt((_a.x - _b.x) * (_a.x - _b.x) + (_a.y - _b.y) * (_a.y - _b.y) ) )
int main()
{
// setfile();
R int n = FastIn();
for (R int i = 1; i <= n; ++i)
p[i] = (Point) {FastIn2(), FastIn2()};
std::random_shuffle(p + 1, p + n + 1);
o = p[1];
R double r = 0;
for (R int i = 2; i <= n; ++i)
if (dist(p[i], o) > r)
{
o = p[i]; r = 0;
for (R int j = 1; j < i; ++j)
if (dist(p[j], o) > r)
{
o.x = (p[i].x + p[j].x) / 2;
o.y = (p[i].y + p[j].y) / 2;
r = dist(p[i], o);
for (R int k = 1; k < j; ++k)
if (dist(p[k], o) > r)
{
o = cir(p[i], p[j], p[k]);
r = dist(p[i], o);
}
}
}
printf("%.6f\n%.6f %.6f", r, o.x, o.y);
return 0;
}
【bzoj1336/1337/2823】最小圆覆盖的更多相关文章
- 2018.07.04 BZOJ1336&&1337: Balkan2002Alien最小圆覆盖
1336: [Balkan2002]Alien最小圆覆盖 1337: 最小圆覆盖 Time Limit: 1 Sec Memory Limit: 162 MBSec Special Judge Des ...
- BZOJ1336 Balkan2002 Alien最小圆覆盖 【随机增量法】*
BZOJ1336 Balkan2002 Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=100000, ...
- 【bzoj1336/1337/2823】[Balkan2002]Alien最小圆覆盖 随机增量法
题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000. ...
- Bzoj 1336&1337 Alien最小圆覆盖
1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec Memory Limit: 162 MBSec Special Judge Submit: 1473 ...
- bzoj1336: [Balkan2002]Alien最小圆覆盖
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1336 1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 ...
- 【BZOJ-1336&1337】Alie最小圆覆盖 最小圆覆盖(随机增量法)
1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1573 ...
- 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)
2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...
- 【BZOJ1336】[Balkan2002]Alien最小圆覆盖 随机增量法
[BZOJ1336][Balkan2002]Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=10000 ...
- bzoj 2823: [AHOI2012]信号塔 最小圆覆盖
题目大意: 给定n个点,求面积最小的园覆盖所有点.其中\(n \leq 10^6\) 题解: 恩... 刚拿到这道题的时候... 什么???最小圆覆盖不是\(O(n^3)\)的随机增量算法吗????? ...
随机推荐
- pandas中.value_counts()的用法
原文链接:https://www.jianshu.com/p/f773b4b82c66 value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值 ...
- 20191110 Spring Boot官方文档学习(4.1)
4. Spring Boot功能 4.1.Spring应用 便捷的启动方式: public static void main(String[] args) { SpringApplication.ru ...
- centos7 VM虚拟机在主机关机重启后,无法ping通
解决办法 1.虚拟机的某些网络相关的服务没有启动,打开电脑的服务启动相关服务 2.打开虚拟机的虚拟网络设置,恢复默认设置即可 3.判定虚拟网卡的网关和centos的网关是否一致,如果不一致,改成一致, ...
- 第十七周周总结 Swing
考试系统 1.登录功能 用户和密码存在在哪里? 文件 2.考试功能 考试题目和答案存在哪? 文件 3.展示功能 GUI Graphical User Interface图形用户接口 #GUI Java ...
- cdh平台问题
问题背景:内容的不懂之处,可以私信博主.友好交流使用.主要针对的问题种类有:网络桥接报错.网卡文件问题(该问题主要看你的安装脚本文件里面写的是否和主机对应,也是运行环境的问题).scm表中没有节点信息 ...
- iScroll使用参考
分享是传播.学习知识最好的方法 以下这篇文章是iScroll.js官网的中文翻译,尽管自己英文不好,但觉得原作者们翻译的这个资料还是可以的,基本用法介绍清楚了.如果你英文比较好的话,可以看看官网的资料 ...
- EML文件(MIME邮件)格式分析
电子邮件普遍遵循的邮件技术规范.MIME邮件由邮件头和邮件体两部分组成.邮件头包括:标题,送信人,收信人,创建日期,邮件体内容类型和邮件体编码方式等内容.邮件体包括:正文,超文本,内嵌数据和附件等内容 ...
- Java 线程池 8 大拒绝策略,面试必问!
前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...
- MyBatis逆向工程无效
在Taget目录下修改的东西无法逆向, 在源代码目录就可以
- 搜索专题:HDU1241 Oil Deposits
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...