1 条题解

  • 0
    @ 2024-3-21 22:12:59

    最小球覆盖,使用模拟退火

    #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
    上传者