模拟退火24分求调
查看原帖
模拟退火24分求调
891956
TempestMiku楼主2023/9/28 06:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
    inline int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    inline void WritE(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) WritE(x/10);
        putchar(x%10+48);
    }
    inline void write(int x){
        WritE(x);
        puts("");
    }
    inline void Write(int x){
        WritE(x);
        putchar(' ');
    }
}
using namespace Testify;
int n;
const int N=1e3+5;
int a[N],b[N],now[N];
int ans,Ans[N];
inline int energy(){
    int A=0,B=0;
    for(register int i=1;i<=n;i++){
        A+=a[i];
        if(i==1){
            B+=a[now[i]]+b[now[i]];
            continue;
        }
        if(A>=B){
            B=A+b[now[i]];
        }
        else{
            B+=b[now[i]];
        }
    }
    return B;
}
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
inline int radom(int l,int r){
    return rd()%(r-l+1)+l;
}
inline void SA(){
    double T=3000;
    while(T>1e-15){
        if((double)clock()/CLOCKS_PER_SEC>0.992){
            write(ans);
            for(register int i=1;i<=n;i++){
                Write(Ans[i]);
            }
            exit(0);
        }
        int ra=radom(1,n);
        int rb=radom(1,n);
        if(ra==rb){
            continue;
        }
        swap(now[ra],now[rb]);
        int e=energy();
        double delta=e-ans;
        if(delta<0){
            ans=e;
            for(register int i=1;i<=n;i++){
                Ans[i]=now[i];
            }
        }
        else if(exp(-delta/T)*RAND_MAX<radom(0,RAND_MAX)){
            swap(now[ra],now[rb]);
        }
        T*=0.995;
    }
}
signed main(void){
    n=read();
    for(register int i=1;i<=n;i++){
        a[i]=read();
    }
    for(register int i=1;i<=n;i++){
        b[i]=read();
        now[i]=i;
    }
    ans=energy();
    while(1){
        SA();
    }
}

感觉没问题,可能是求 energy()energy() 错了?

2023/9/28 06:48
加载中...