BZOJ1336 Balkan2002 Alien最小圆覆盖


Description

给出N个点,让你画一个最小的包含所有点的圆。

Input

先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)

Output

输出圆的半径,及圆心的坐标

Sample Input

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

Sample Output

5.00
5.00 5.00


最小圆覆盖模板,随机增量法,只需要YY一下怎么利用三点确定圆心就好了

一开始写模拟退火无奈GG,后面也是看看正解才知道有这么一个玩意,很神奇,不过挺巧妙的

其实说实话呢,不加随机打乱节点顺序也可以过,大概是个假随机吧,其实就是O(n3)O(n3)枚举

照着黄学长代码打的。。涨姿势了


#include<bits/stdc++.h>
using namespace std;
#define eps 1e-12
#define N 100010
struct Node{double x,y;}p[N],ans;
int n;
double R;
double dis(Node a,Node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(double a,double b){
return fabs(a-b)<eps;
}
Node geto(Node a,Node b,Node c){
double a1=2*(b.x-a.x);
double a2=2*(c.x-a.x);
double b1=2*(b.y-a.y);
double b2=2*(c.y-a.y);
double c1=b.x*b.x-a.x*a.x+b.y*b.y-a.y*a.y;
double c2=c.x*c.x-a.x*a.x+c.y*c.y-a.y*a.y;
Node o;
if(cmp(a1,0)){
o.y=c1/b1;
o.x=(c2-ans.y*b2)/a2;
}else if(cmp(b1,0)){
o.x=c1/a1;
o.y=(c2-ans.x*a2)/b2;
}else{
o.x=(c2*b1-c1*b2)/(a2*b1-a1*b2);
o.y=(c2*a1-c1*a2)/(b2*a1-b1*a2);
}
return o;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=1;i<=n;i++)
swap(p[rand()%n+1],p[rand()%n+1]);
ans=p[1];
for(int i=1;i<=n;i++){
double tmp1=dis(ans,p[i]);
if(tmp1<R||cmp(tmp1,R))continue;
ans.x=(p[i].x+p[1].x)/2;
ans.y=(p[i].y+p[1].y)/2;
R=dis(p[i],p[1])/2;
for(int j=2;j<i;j++){
tmp1=dis(ans,p[j]);
if(tmp1<R||cmp(tmp1,R))continue;
ans.x=(p[i].x+p[j].x)/2;
ans.y=(p[i].y+p[j].y)/2;
R=dis(p[i],p[j])/2;
for(int k=1;k<j;k++){
tmp1=dis(ans,p[k]);
if(tmp1<R||cmp(tmp1,R))continue;
ans=geto(p[i],p[j],p[k]);
R=dis(ans,p[i]);
}
}
}
printf("%.10lf\n%.10lf %.10lf",R,ans.x,ans.y);
return 0;
}

BZOJ1336 Balkan2002 Alien最小圆覆盖 【随机增量法】*的更多相关文章

  1. 【BZOJ1336】[Balkan2002]Alien最小圆覆盖 随机增量法

    [BZOJ1336][Balkan2002]Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=10000 ...

  2. 【bzoj1336/1337/2823】[Balkan2002]Alien最小圆覆盖 随机增量法

    题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000. ...

  3. bzoj1336: [Balkan2002]Alien最小圆覆盖

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1336 1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 ...

  4. BZOJ.2823.[AHOI2012]信号塔(最小圆覆盖 随机增量法)

    BZOJ 洛谷 一个经典的随机增量法,具体可以看这里,只记一下大体流程. 一个定理:如果一个点\(p\)不在点集\(S\)的最小覆盖圆内,那么它一定在\(S\bigcup p\)的最小覆盖圆上. 所以 ...

  5. [BZOJ2823][BZOJ1336][BZOJ1337]最小圆覆盖(随机增量法)

    算法介绍网上有很多,不解释了. 给出三点坐标求圆心方法:https://blog.csdn.net/liyuanbhu/article/details/52891868 记得先random_shuff ...

  6. hdu 3007【最小圆覆盖-随机增量法模板】

    #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> usin ...

  7. [BZOJ 1336] [Balkan2002] Alien最小圆覆盖 【随机增量法】

    题目链接:BZOJ - 1336 题目分析 最小圆覆盖有一个算法叫做随机增量法,看起来复杂度像是 O(n^3) ,但是可以证明其实平均是 O(n) 的,至于为什么我不知道= = 为什么是随机呢?因为算 ...

  8. BZOJ 1337: 最小圆覆盖1336: [Balkan2002]Alien最小圆覆盖(随机增量法)

    今天才知道有一种东西叫随机增量法就来学了= = 挺神奇的= = A.令ci为包括前i个点的最小圆,若第i+1个点无法被ci覆盖,则第i+1个点一定在ci+1上 B.令ci为包括前i个点的最小圆且p在边 ...

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

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

随机推荐

  1. mysql_fetch_assoc查询多行数据

    每次从查询结果中返回一行数据,作为关联数组,类似于一个游标,第一次是返回第一行,第二次迭代就是第二行,以此类推 如果返回多行,使用如下方法就可以了 while($row = $db->fetch ...

  2. 在Extjs 的 TabPanel在 title标题栏上加按扭button

    如何在tabPanel的 标题栏的右侧添加操作按扭,效果如图,我总结了两种实现的方案: 第一种方案: 使用tabPanel的tabPbar: Ext.define("CisApp.view. ...

  3. Outlook.com 系列邮箱 POP3 及 IMAP 设置方法

    支持 Exchange ActiveSync 的应用 有了 EAS,你可以立即获取电子邮件,以及在一个位置查看所有文件夹.日历和联系人. 如果你的电子邮件应用支持Exchange ActiveSync ...

  4. mongodb安装、运行

    1.下载安装: 切换到:/usr/local/ mkdir -p mongodb groupadd -g 800 mongodb useradd -u 801 -g mongodb mongodb c ...

  5. jQuery 中$.ajax()方法参数详解

    $.ajax({ url:'test.do', data:{id:,name:'xiaoming'}, type:'post', dataType:'json', success:function(d ...

  6. C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 04)

    -------------------- interface 接口 // 定义: type IHumaner interface { SayHi() // 接口中只能是方法声明,没有实现,没有数据字段 ...

  7. Python 序列化pickle/cPickle模块整理

    Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再 ...

  8. RabbitMQ消息队列(九)RPC开始应用吧

    一 简单应用 RPC——远程过程调用,通过网络调用运行在另一台计算机上的程序的函数\方法,是构建分布式程序的一种方式.RabbitMQ是一个消息队列系统,可以在程序之间收发消息.利用RabbitMQ可 ...

  9. 利用expect和sshpass完美非交互性执行远端命令

    yum install expect -y expect 参考:http://blog.csdn.net/snow_114/article/details/53245466 yum install s ...

  10. Java进阶2 数组内存和对象的内存管理知识

    Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...