计算几何萌新求助

P1742 最小圆覆盖

那是你代码写萎+数据太水了....
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


| 下一页