1 条题解
-
0
最小球覆盖,使用模拟退火
#include<iostream> #include<math.h> using namespace std; const double eps=1e-8; struct point{double x,y,z;} p[(int)1e5+5]; int n,pos; double T,delta=0.99,r,ans; double sq(double x){return x*x;} point c; double dis(point a,point b){return sqrt(sq(a.x-b.x)+sq(a.y-b.y)+sq(a.z-b.z));} double solve(){ T=100.0; c=p[0]; while(T>eps){ pos=0,r=0; for(int i=0;i<n;i++) if(dis(c,p[i])>r) r=dis(c,p[i]),pos=i; c.x+=(p[pos].x-c.x)/r*T; c.y+=(p[pos].y-c.y)/r*T; c.z+=(p[pos].z-c.z)/r*T; T*=delta; } return r; } int main(){ while(cin>>n){ if(n==0)break; // cin>>n; for(int i=0;i<n;i++)cin>>p[i].x>>p[i].y>>p[i].z; // for(int i=0;i<n;i++)cout<<p[i].x<<p[i].y<<p[i].z; ans=solve(); printf("%.5f\n",ans); } return 0; }
- 1
信息
- ID
- 1074
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 4
- 已通过
- 1
- 上传者