首先我写了个凸包就溜了

这是最小圆覆盖问题,今晚学了一下

先随机化点,一个个加入

假设当前圆心为o,半径为r,加入的点为i

若i不在圆里面,令圆心为i,半径为0

再重新从1~i-1不停找j不在圆里面,令圆心为ij中点,直径为ij距离

再重新在1~j-1不停找k不在圆里面,三点可确定一圆,初中数学

复杂度看似O(n^3)实则O(n),好玄学

坑点:注意如果用点斜式表示方程有斜率为不存在的情况,需要特判

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-;
double sqr(double x){return x*x;} struct point{ double x,y;point(){} point(double X,double Y){x=X,y=Y;} };
double getdis(point p1,point p2){return sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y));}
point middle(point p1,point p2){return point((p1.x+p2.x)/,(p1.y+p2.y)/);}
double slope (point p1,point p2)
{
if(p2.x==p1.x)return ;
return (p2.y-p1.y)/(p2.x-p1.x);
}
double multi(point p1,point p2,point p0)
{
double x1,y1,x2,y2;
x1=p1.x-p0.x;
y1=p1.y-p0.y;
x2=p2.x-p0.x;
y2=p2.y-p0.y;
return x1*y2-x2*y1;
} struct segment{ double k,b;segment(){} segment(double K,double B){k=K,b=B;} };
segment getseg(double k,point pp){return segment(k,pp.y-k*pp.x);}
point intersection(segment s1,segment s2)
{
double x=(s2.b-s1.b)/(s1.k-s2.k);
double y=s1.k*x+s1.b;
return point(x,y);
} //--------------------------------------simple-------------------------------------------------------- int n; point p[];
bool cmp(point p1,point p2)
{
double d=multi(p1,p2,p[]);
if(fabs(d)<=eps)return getdis(p1,p[])<getdis(p2,p[]);
else return d>;
}
int top,sta[];
void graham()
{
sort(p+,p+n+,cmp);
top=;sta[++top]=,sta[++top]=;
double g;
for(int i=;i<=n;i++)
{
while(top>=)
{
g=multi(p[sta[top]],p[i],p[sta[top-]]);
if(g<||fabs(g)<=eps)top--;
else break;
}
sta[++top]=i;
}
} //------------------------------------graham---------------------------------------------------------- point getcore(point p1,point p2,point p3)
{
double g=multi(p1,p2,p3);
if(fabs(g)<=eps)
{
double d1=getdis(p1,p2),d2=getdis(p1,p3),d3=getdis(p2,p3);
if(d1>d2&&d1>d3)return middle(p1,p2);
if(d2>d1&&d2>d3)return middle(p1,p3);
if(d3>d1&&d3>d2)return middle(p2,p3);
}
else
{
segment s1,s2;
if(slope(p1,p2)==)
{
s1=getseg(-/slope(p1,p3),middle(p1,p3));
s2=getseg(-/slope(p2,p3),middle(p2,p3));
}
else if(slope(p1,p3)==)
{
s1=getseg(-/slope(p1,p2),middle(p1,p2));
s2=getseg(-/slope(p2,p3),middle(p2,p3));
}
else
{
s1=getseg(-/slope(p1,p2),middle(p1,p2));
s2=getseg(-/slope(p1,p3),middle(p1,p3));
}
return intersection(s1,s2);
}
} void circlecover()
{
random_shuffle(sta+,sta+top+);
point o=p[sta[]];double r=,d;
for(int i=;i<=top;i++)
if(getdis(o,p[sta[i]])>r)
{
o=p[sta[i]],r=;
for(int j=;j<i;j++)
if(getdis(o,p[sta[j]])>r)
{
o=middle(p[sta[i]],p[sta[j]]),r=getdis(o,p[sta[i]]);
for(int k=;k<j;k++)
if(getdis(o,p[sta[k]])>r)
o=getcore(p[sta[i]],p[sta[j]],p[sta[k]]),r=getdis(o,p[sta[i]]);
}
}
printf("%.2lf %.2lf %.2lf\n",o.x,o.y,r);
} //------------------------------------solve---------------------------------------------------------- int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
if(p[i].y<p[].y||(p[i].y==p[].y&&p[i].x<p[].x))
swap(p[i],p[]);
}
graham();
circlecover(); return ;
}

bzoj2823: [AHOI2012]信号塔&&1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖的更多相关文章

  1. bzoj2823[AHOI2012]信号塔

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1190  Solved: 545[Submit][Status ...

  2. BZOJ2823 [AHOI2012]信号塔 【最小圆覆盖】

    题目链接 BZOJ2823 题解 最小圆覆盖模板 都懒得再写一次 #include<iostream> #include<cstdio> #include<cmath&g ...

  3. [日常摸鱼]bzoj2823 [AHOI2012]信号塔

    题意:$n$个点,求最小圆覆盖,$n \leq 5e5$ 这题数据是随机的hhh 我们可以先求出凸包然后对凸包上的点求最小圆覆盖-(不过直接求应该也行?) 反正随便写好像都能过- #include&l ...

  4. 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)

    [BZOJ2823][AHOI2012]信号塔(最小圆覆盖) 题面 BZOJ 洛谷 相同的题: BZOJ1 BZOJ2 洛谷 题解 模板题... #include<iostream> #i ...

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

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

  6. 【bzoj2823】 AHOI2012—信号塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2823 (题目链接) 题意 求最小圆覆盖 Solution 关于最小圆覆盖的做法,论文里面都有.其实真 ...

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

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

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

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

  9. 【BZOJ】2823: [AHOI2012]信号塔

    题意 给\(n\)个点,求一个能覆盖所有点的面积最小的圆.(\(n \le 50000\)) 分析 随机增量法 题解 理论上\(O(n^3)\)暴力,实际上加上随机化后期望是\(O(n)\)的. 算法 ...

随机推荐

  1. [第一波模拟\day1\T2]{分班}(divide.cpp)

    [题目描述] 小N,小A,小T又大了一岁了. 现在,他们已经是高二年级的学生了.众所周知,高二的小朋友是要进行文理科分班考试的,这样子的话,三个好朋友说不定就会不分在一个班. 于是三个人决定,都考平均 ...

  2. maven+Spring环境搭建

    一,项目结构图 二,applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> &l ...

  3. MySQL数据库不识别server=.而是识别localhost

    MySQL数据库不识别server=.而是识别localhost

  4. unbuntu下安装多个JAVA JDK版本及如何切换

    当前环境已经安装过jdk1.6.0_45安装JDK 1.7.x时,若安装错误,可执行以下步骤:sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-ge ...

  5. 积累js里有用的函数库

    一.兼容地获取非行间样式(兼容火狐,ie,chrome) function getStyle(obj,name) { if(obj.currentStyle){ return obj.currentS ...

  6. 使用imageMagick 制作圆角矩形和图片加水印

    制作圆角矩形好图片水印都是图片合成的操作 composite -gravity southeast mask175.png  src.jpg  dest.jpg -gravity southeast ...

  7. iOS textView在调用textViewDidChange方法,中文输入的问题

    有时候,需要在textViewDidChange处理时,在中文输入的情况下,例如输入“中”,对应的拼音“zhong”, 在textViewDidChange的方法里会把拼音也算进去:导致输入中文时也输 ...

  8. POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】

    题意: 给了n种硬币的名称,给了m种硬币间的转换关系. 从任意兑换地点开始兑换,看是否能够通过兑换的方式增加金钱. 思路: 用SPFA不断对各个点进行松弛操作,寻找正权值的环.如果找到则输出Yes. ...

  9. loj517 计算几何瞎暴力(Trie树)

    题目: https://loj.ac/problem/517 分析: 操作4比较特殊,我们先来分析下操作4 操作4相当于需要一个数据结构,使得里面的数据有序(这有很多选择) 结合操作1,操作4的“排序 ...

  10. QT窗体间传值总结之Signal&Slot

    在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...