1 条题解

  • 1
    @ 2025-8-18 11:39:52

    参考模拟退火程序:

    #include <bits/stdc++.h>
    using namespace std;
    long double w[6][1012];
    inline long double dis(long double a,long double b,long double c,long double d)
    {
        return sqrtl((c-a)*(c-a)+(d-b)*(d-b));
    }
    inline bool blunt(long double a,long double b,long double c)
    {
        return (a*a+c*c<b*b||a*a+b*b<c*c);
    }
    inline long double height(long double a,long double b,long double c)
    {
        long double p=(a+b+c)/2;
        return 2*sqrtl(p*(p-a)*(p-b)*(p-c))/a;
    }
    inline long double check(long double dx,long double dy,int p)
    {
        long double c=dis(dx,dy,w[0][p],w[1][p]);
        long double b=dis(dx,dy,w[2][p],w[3][p]);
        long double a=dis(w[0][p],w[1][p],w[2][p],w[3][p]);
        long double res=min(b,c);
        res=min(res,dis(dx,dy,w[4][p],w[5][p]));
        if(!blunt(a,b,c)) res=min(res,height(a,b,c));
        return res;
    }
    inline long double rd(long double m)
    {
        return rand()*1.0/RAND_MAX*m;
    }
    int go()
    {
        srand(time(0));
        int n;
        cin>>n;
        long double s=0;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=5;j++)
            {
                cin>>w[j][i];
                s=max(s,w[j][i]);
            }
        long double S=pow(0.9999,-100000000.0/n),T=pow(0.9999,100000000.0/n);
        long double bx=s/2,by=s/2,bz=1e9;
        long double cx=s/2,cy=s/2,cz=1e9;
        long double f=1;
        while(S>T)
        {
            long double dx=bx+rd(s/10*f)-s/20*f;
            long double dy=by+rd(s/10*f)-s/20*f;
            long double dz=0;
            for(int i=1;i<=n;i++)
                dz=max(dz,check(dx,dy,i));
            if(dz<bz) bx=dx,by=dy,bz=dz,cx=dx,cy=dy,cz=dz;
            else if(rd(1)<exp((bz-dz)/S)) bx=dx,by=dy,bz=dz;
            f-=1e-8;
            S*=0.9999;
        }
        cout<<fixed<<setprecision(8)<<bx<<' '<<by<<' '<<bz<<endl;
        return 0;
    }
    int main()
    {
        int T=1;
        //cin>>T;
        while(T--) go();
        return 0;
    }
    

    参考答案(R=4500.95088993R = 4500.95088993):

    5333.91419898 4918.20501141
    
    • 1

    信息

    ID
    264
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    101
    已通过
    4
    上传者