门芯袜子初学OI,遇退火40pts被薄纱,求调教♥♥
查看原帖
门芯袜子初学OI,遇退火40pts被薄纱,求调教♥♥
891956
TempestMiku楼主2023/9/18 17:56
#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>9) Write(x/10);
        putchar(x%10+48);
    }
    inline void write(int x){
        if(x<0) putchar('-'),x=-x;
        Write(x);
        putchar(' ');
    }
}
using namespace Testify;
int n,m,c;
const int N=25;
int p[N],p2[N];
int G[N][N];
mt19937 rd(chrono::system_clock::now().time_since_epoch().count());
inline int radom(int l,int r){
    return rd()%(r-l+1)+l;
}
inline int energy(){
    int res=0;
    for(register int i=1;i<=n;i++){
        for(register int j=1;j<=m;j++){
            if(i==1&&j==1) continue;
            if(i==1){
                if(G[i][j]!=G[i][j-1]){
                    res++;
                }
                continue;
            }
            if(j==1){
                if(G[i][j]!=G[i-1][j]){
                    res++;
                }
                continue;
            }
            if(G[i][j]!=G[i-1][j]){
                res++;
            }
            if(G[i][j]!=G[i][j-1]){
                res++;
            }
        }
    }
    return res;
}
int ans;
inline void SA(){
    double T=3000;
    while(T>1e-15){
        int ra1=radom(1,n);
        int ra2=radom(1,m);
        int rb1=radom(1,n);
        int rb2=radom(1,m);
        if(ra1==rb1&&ra2==rb2){
            continue;
        }
        swap(G[ra1][ra2],G[rb1][rb2]);
        int e=energy();
        double delta=e-ans;
        if(delta<0){
            ans=e;
        }
        else{
            swap(G[ra1][ra2],G[rb1][rb2]);
        }
        T*=0.995;
    }
}
signed main(void){
    n=read(),m=read(),c=read();
    if(n==1&&m==1){
        write(1);
        return 0;
    }
    for(register int i=1;i<=c;i++){
        p[i]=p2[i]=read();
    }
    for(register int i=1;i<=n;i++){
        for(register int j=1;j<=m;j++){
            int op;
            TERABYTE:
            op=radom(1,c);
            if(!p2[op]) {
                goto TERABYTE;
            }
            else{
                p2[op]--;
            }
            G[i][j]=op;
        }
    }
    ans=energy();
    while((double)clock()/CLOCKS_PER_SEC<4.8){
        SA();
    }
    for(register int i=1;i<=n;i++){
        for(register int j=1;j<=m;j++){
            write(G[i][j]);
        }
        puts("");
    }
    return 0;
}
2023/9/18 17:56
加载中...