题目大意:给定平面上 n 个点,求最小圆覆盖
我就是抄了个板而已…
Q:为什么是
O(n)
的
A:(摇头摇头摇头
Q:三角形外心怎么求
A:不知道…
Q:学这个有什么用
A:(一脸懵逼
Q:怎么什么都不知道→→
A:窝弱嘛TAT
怎么觉得自己又抽了=。=
三角形外心 (我知道泥萌都会。。。
因为到各点距离相等,有
(x1−x)2−(y1−y)2=(x2−x)2+(y2−y)2(x2−x)2+(y2−y)2=(x3−x)2+(y3−y)2
化简得到
2(x2−x1)x+2(y2−y1)y=x22+y22−x21−y21 / A1x+B1y=C12(x3−x2)x+2(y3−y2)y=x23+y23−x22−y22 / A2x+B2y=C2
有
⎧⎩⎨x=C1B2−C2B1A1B2−A2B1y=A1C2−A2C1A1B2−A2B1
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define D double
#define N 505
#define pf(x) (x * x)
using namespace std;
int n;D r;
struct point{D x,y;}e[N],ans;
D dis(point a,point b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
point center(point a,point b,point c)
{
D A1 = (b.x - a.x) * 2,B1 = (b.y - a.y) * 2,C1 = pf(b.x) + pf(b.y) - pf(a.x) - pf(a.y);
D A2 = (c.x - b.x) * 2,B2 = (c.y - b.y) * 2,C2 = pf(c.x) + pf(c.y) - pf(b.x) - pf(b.y);
return (point){(C1 * B2 - C2 * B1) / (A1 * B2 - A2 * B1),
(A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1)};
}
void mcc()
{
random_shuffle(e + 1,e + n + 1);
ans = e[1],r = 0;
for (int i = 2;i <= n;i ++)
if (dis(ans,e[i]) > r)
{
ans = e[i],r = 0;
for (int j = 1;j < i;j ++)
if (dis(ans,e[j]) > r)
{
ans.x = (e[i].x + e[j].x) / 2.;
ans.y = (e[i].y + e[j].y) / 2.;
r = dis(ans,e[j]);
for (int k = 1;k < j;k ++)
if (dis(ans,e[k]) > r)
{
ans = center(e[i],e[j],e[k]);
r = dis(ans,e[i]);
}
}
}
}
int main()
{
while (scanf("%d",&n) && n)
{
for (int i = 1;i <= n;i ++)
scanf("%lf%lf",&e[i].x,&e[i].y);
mcc();
printf("%.2f %.2f %.2f\n",ans.x,ans.y,r);
}
return 0;
}