1336: [Balkan2002]Alien最小圆覆盖

1337: 最小圆覆盖

Time Limit: 1 Sec Memory Limit: 162 MBSec Special Judge

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

这两道题是最小圆覆盖的裸题,这里主要讲讲求最小圆覆盖的思路。

最小圆覆盖问题就是让你求一个最小的圆使得它能够刚好覆盖掉给出的点。本蒟蒻学习的是一种期望效率O(n)" role="presentation" style="position: relative;">O(n)O(n)的算法。

那么我们怎么做呢?

首先,我们假设前i−1" role="presentation" style="position: relative;">i−1i−1个点已经被现在的圆给覆盖掉了,现在正在处理第i" role="presentation" style="position: relative;">ii个点,那么我们check" role="presentation" style="position: relative;">checkcheck一波,如果当前点在圆外,我们就重构覆盖前i" role="presentation" style="position: relative;">ii个点的最小覆盖圆,具体操作就是先以i" role="presentation" style="position: relative;">ii为圆心作圆,然后从前i−1" role="presentation" style="position: relative;">i−1i−1个点中找一个点j" role="presentation" style="position: relative;">jj使得j" role="presentation" style="position: relative;">jj在圆外,此时最小覆盖圆应该为i,j" role="presentation" style="position: relative;">i,ji,j中点,然后我们再从前j−1" role="presentation" style="position: relative;">j−1j−1个点中找一个点k" role="presentation" style="position: relative;">kk使得k" role="presentation" style="position: relative;">kk在圆外,这时最小覆盖圆自然应该是三角形ijk" role="presentation" style="position: relative;">ijkijk的外接圆。我们一直这样操作到前i" role="presentation" style="position: relative;">ii个点都能够check" role="presentation" style="position: relative;">checkcheck成功为止。

但这样的话最坏情况不应该是O(n3)" role="presentation" style="position: relative;">O(n3)O(n3)吗?是的,因此我们要在最开始的时候将点随机打乱,这样的话期望的效率就应该是O(n)" role="presentation" style="position: relative;">O(n)O(n)的了。还有就是注意T1336" role="presentation" style="position: relative;">T1336T1336应该保留10" role="presentation" style="position: relative;">1010位小数而不是题目上说的2" role="presentation" style="position: relative;">22位。

T1336" role="presentation" style="position: relative;">T1336T1336代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct point{double x,y;}p[N],O;
struct line{double a,b,c;};
double r;
inline double mul(double x){return x*x;}
inline double dis(point x,point y){return sqrt(mul(x.x-y.x)+mul(x.y-y.y));}
inline bool in_check(point x){return dis(O,x)<=r;}
inline point calc(line a,line b){return point{(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a),(b.c*a.a-a.c*b.a)/(a.b*b.a-b.b*a.a)};}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
    random_shuffle(p+1,p+n+1);
    r=0;
    for(int i=1;i<=n;++i){
        if(in_check(p[i]))continue;
        O.x=p[i].x,O.y=p[i].y,r=0;
        for(int j=1;j<i;++j){
            if(in_check(p[j]))continue;
            O.x=(p[i].x+p[j].x)/2,O.y=(p[i].y+p[j].y)/2;
            r=dis(O,p[i]);
            for(int k=1;k<j;++k){
                if(in_check(p[k]))continue;
                O=calc(line{2*(p[i].x-p[k].x),2*(p[i].y-p[k].y),mul(p[k].x)+mul(p[k].y)-mul(p[i].x)-mul(p[i].y)},line{2*(p[i].x-p[j].x),2*(p[i].y-p[j].y),mul(p[j].x)+mul(p[j].y)-mul(p[i].x)-mul(p[i].y)});
                r=dis(p[i],O);
            }
        }
    }
    printf("%.10lf\n%.10lf %.10lf",r,O.x,O.y);
    return 0;
}

T1337" role="presentation" style="position: relative;">T1337T1337代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct point{double x,y;}p[N],O;
struct line{double a,b,c;};
double r;
inline double mul(double x){return x*x;}
inline double dis(point x,point y){return sqrt(mul(x.x-y.x)+mul(x.y-y.y));}
inline bool in_check(point x){return dis(O,x)<=r;}
inline point calc(line a,line b){return point{(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a),(b.c*a.a-a.c*b.a)/(a.b*b.a-b.b*a.a)};}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
    random_shuffle(p+1,p+n+1);
    r=0;
    for(int i=1;i<=n;++i){
        if(in_check(p[i]))continue;
        O.x=p[i].x,O.y=p[i].y,r=0;
        for(int j=1;j<i;++j){
            if(in_check(p[j]))continue;
            O.x=(p[i].x+p[j].x)/2,O.y=(p[i].y+p[j].y)/2;
            r=dis(O,p[i]);
            for(int k=1;k<j;++k){
                if(in_check(p[k]))continue;
                O=calc(line{2*(p[i].x-p[k].x),2*(p[i].y-p[k].y),mul(p[k].x)+mul(p[k].y)-mul(p[i].x)-mul(p[i].y)},line{2*(p[i].x-p[j].x),2*(p[i].y-p[j].y),mul(p[j].x)+mul(p[j].y)-mul(p[i].x)-mul(p[i].y)});
                r=dis(p[i],O);
            }
        }
    }
    printf("%.3lf",r);
    return 0;
}

2018.07.04 BZOJ1336&&1337: Balkan2002Alien最小圆覆盖的更多相关文章

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

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

  2. 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...

  3. Bzoj 1336&1337 Alien最小圆覆盖

    1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1473  ...

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

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

  5. 2018.07.04 POJ 1265 Area(计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description Being well known for its highly innovative ...

  6. 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)

    Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...

  7. 2018.07.04 POJ 1113 Wall(凸包)

    Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...

  8. 2018.07.04 POJ 1654 Area(简单计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...

  9. 2018.07.04 POJ 3304 Segments(简单计算几何)

    Segments Time Limit: 1000MS Memory Limit: 65536K Description Given n segments in the two dimensional ...

随机推荐

  1. PHP中间件--ICE

    ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中间件.使用ICE能使得php(或c++,java,python)与java,c++,.net,py ...

  2. jsp 调用其他jsp页面 跳转

    response.sendRedirect("test2.jsp"); window.location.reload("test2.jsp"); locatio ...

  3. re(正则)模块

    import re # re 存在5种使用方式 #1. macth #2.search #3.findall #4.split #5 sub re.match('^chen', 'chenhua123 ...

  4. CentOS 7 基础命令安装

    https://my.oschina.net/u/1428349/blog/288708 1. ifconfig安装 > yum install net-tools 临时变量(可以直接使用sbi ...

  5. tensorflow笔记之学习率设置

    在使用梯度下降最小化损失函数时,如果学习率过大会导致问题不能收敛到最优解,学习率过小,虽然可以收敛到最优解,但是需要的迭代次数会大大增加,在Tensorflow中,可以用指数衰减法设置学习率,tf.t ...

  6. DateFormat工具类

    import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java. ...

  7. lzo文件压缩,解压

    LZOP命令安装 yum install lzop lzop命令基本操作命令 # lzop -v test # 创建test.lzo压缩文件,输出详细信息,保留test文件不变 # lzop -Uv ...

  8. 一文看懂Stacking!(含Python代码)

    一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ

  9. Linux下tar.gz 安装

    将安装文件拷贝至你的目录中 如果是以root身份登录上的,就将软件拷贝至/root中. cp xxx.tar.gz /root 解压缩包 tar xvzf xxx.tar.gz 切换到安装目录下 cd ...

  10. sublimetext 2 编译文件带input时 提示 EOFError: EOF when reading a line

    昨天在网下下载了个什么sublimetxt 2 的破解版,然后让我折腾了半天,没错 ,就是因为这个 EOFError: EOF when reading a line错误让我搞的半死.怨自己,贪图中文 ...