首先我写了个凸包就溜了

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

先随机化点,一个个加入

假设当前圆心为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. 用cpp写对拍程序

    #include <bits/stdc++.h> using namespace std; int main() { while(true) { puts(""); p ...

  2. 【Codeforces 1006D】Two Strings Swaps

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 注意只能改变a不能改变b 然后只要让a[i],b[i],a[n-i-1],b[n-i-1]这4个字符能凑成两对.全都一样就可以了 分类讨论下就 ...

  3. 大数据学习——采集目录到HDFS

    采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 l  采集源,即source——监控文件目录 :  spoold ...

  4. jenkins 提示No emails were triggered

    发送邮件 Jenkins->系统管理->系统设置,在“邮件通知”里设置smtp服务器地址,以及发送者邮箱地址,在具体的任务构建完成以后,可以设置发送邮件,在某一个任务的"Add ...

  5. [Go]条件语句

    package main import ( "io/ioutil" "fmt" ) //条件语句 //if的条件语句不需要括号 //if的条件里可以赋值,if的 ...

  6. MacOS & iOS

    MacOS & iOS https://github.com/qinjx/30min_guides/blob/master/ios.md https://www.cnblogs.com/xgq ...

  7. [Vijos1512] SuperBrother打鼹鼠 (二维树状数组)

    传送门 直接搞就行. 注意下表re从零开始,而树状数组搞不了0,所以统一增加一个偏移量1. (话说数据随机是什么鬼?) # include <iostream> # include < ...

  8. 【设计模式】GOF设计模式趣解(23种设计模式)

    创建型模式                   1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说 ...

  9. git push ‘No refs in common and none specified’doing nothing问题解决

    git push ‘No refs in common and none specified’doing nothing问题解决 输入git push origin master即可解决问题

  10. POJ 1094 Sorting It All Out【拓扑排序】

    题目链接: http://poj.org/problem?id=1094 题意: 给定前n个字母的大小关系,问你是否 根据前xxx个关系得到上升序列 所有关系都无法确定唯一的一个序列 第xxx个关系导 ...