那是你代码写萎+数据太水了....
by wurzang @ 2020-12-30 18:22:36
正确性是有保障的吧,只是你脸比较黑而已
by Schwarzkopf_Henkal @ 2020-12-30 18:23:07
@[exzαng](/user/344016) 哦吼,那该怎么写,我代码贴一下:
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const double eps=1e-12;
int n;
struct Line{double k,b;};
struct Point{double x,y;}a[N];
struct Circle{Point O;double r;}res;
Point Mid(Point a,Point b){
return (Point){(a.x+b.x)/2,(a.y+b.y)/2};
}
double dist(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
Point Cross(Line a,Line b){
Point res;
res.x=(b.b-a.b)/(a.k-b.k);
res.y=a.k*res.x+a.b;
return res;
}
Line Match(Point a,Point b){
Line res;
res.k=(a.y-b.y)/(a.x-b.x);
res.b=a.y-a.x*res.k;
return res;
}
Line Fuck(Point a,double k){
return (Line){k,a.y-a.x*k};
}
Circle Circumcircle(Point a,Point b,Point c){
Line f=Match(a,b),g=Match(b,c);
f=Fuck(Mid(a,b),-1/f.k);
g=Fuck(Mid(b,c),-1/g.k);
Point O=Cross(f,g);
return (Circle){O,dist(O,a)};
}
int main(){
srand(time(NULL));
cin>>n;
for(int i=1;i<=n;++i){
scanf("%lf%lf",&a[i].x,&a[i].y);
// if(rand()%2) a[i].x+=eps;
// else a[i].x-=eps;
// if(rand()%2) a[i].y+=eps;
// else a[i].y-=eps;
}
random_shuffle(a+1,a+1+n);
res=(Circle){Mid(a[1],a[2]),dist(a[1],a[2])/2};
for(int i=3;i<=n;++i){
if(dist(res.O,a[i])<=res.r) continue;
res=(Circle){a[i],0};
for(int j=1;j<i;++j){
if(dist(res.O,a[j])<=res.r) continue;
res=(Circle){Mid(a[j],a[i]),dist(a[j],a[i])/2};
for(int k=1;k<j;++k){
if(dist(res.O,a[k])<=res.r) continue;
res=Circumcircle(a[k],a[j],a[i]);
}
}
}
printf("%.10lf\n%.10lf %.10lf\n",res.r,res.O.x,res.O.y);
return 0;
}
```
by 「 」 @ 2020-12-30 18:23:29
@[Point_King](/user/72468) 懒得帮你调了,放下我的代码
by wurzang @ 2020-12-30 18:24:52
```cpp
#include<bits/stdc++.h>
using namespace std;
struct point{
double x,y;
point(){}
point(double _x,double _y){
x=_x; y=_y;
}
point operator +(const point &b) const{
return point(x+b.x,y+b.y);
}
point operator -(const point &b) const{
return point(x-b.x,y-b.y);
}
double operator *(const point &b) const{
return x*b.y-y*b.x;
}
point operator *(const double &b) const{
return point(x*b,y*b);
}
point operator /(const double &b) const{
return point(x/b,y/b);
}
}a[100005];
double len(point o){
return sqrt(o.x*o.x+o.y*o.y);
}
struct circle{
point o;
double r;
circle(){}
circle(point _o,double _r){
o=_o; r=_r;
}
};
point rotate(point x){
return point(x.y,-x.x);
}
point getCrossover(point p0,point p1,point p2,point p3){
point tmp;
tmp=(p3-p2)*(((p1-p0)*(p2-p0))/((p3-p2)*(p1-p0)));
tmp=tmp+p2;
return tmp;
}
circle getCircle(point p0,point p1,point p2){
point c1,c2;
c1=(p0+p1)/2;
c2=(p0+p2)/2;
point a1,a2,b1,b2;
a1=rotate(p0-c1)+c1;
a2=rotate(p1-c1)+c1;
b1=rotate(p0-c2)+c2;
b2=rotate(p2-c2)+c2;
point tmp=getCrossover(a1,a2,b1,b2);
return circle(tmp,len(tmp-p0));
}
int main(){
circle c;
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i].x>>a[i].y;
random_shuffle(a+1,a+n+1);
c=circle(point(0,0),0);
for(int i=1;i<=n;++i){
if(len(a[i]-c.o)>c.r){
c=circle(a[i],0);
for(int j=1;j<i;++j)
if(len(a[j]-c.o)>c.r){
c=circle((a[i]+a[j])/2,len(a[i]-a[j])/2);
for(int k=1;k<j;++k)
if(len(a[k]-c.o)>c.r){
c=getCircle(a[i],a[j],a[k]);
}
}
}
}
printf("%.10lf\n%.10lf %.10lf",c.r,c.o.x,c.o.y);
return 0;
}
```
by wurzang @ 2020-12-30 18:25:07
@[exzαng](/user/344016) 不不不,也不是需要你调。别人写的代码我也看了很多次了,就是为什么别人的好像可以一次过样例,我的就是随机的呢?
by 「 」 @ 2020-12-30 18:30:09
@[Point_King](/user/72468) 把 eps 改成 1e-10 就行了.....
by wurzang @ 2020-12-30 18:32:58
@[exzαng](/user/344016) 这个 `eps` 我根本没用上。。。
by 「 」 @ 2020-12-30 18:34:16
@[Point_King](/user/72468)
草 本地跑 eps=1e-11,1e-10 的时候都过了样例,再跑一次就没过了
by wurzang @ 2020-12-30 18:38:45
@[exzαng](/user/344016) 他的代码貌似没有用到 eps 吧= =
貌似是一定概率过样例
by MatrixCascade @ 2020-12-30 18:40:48