10分求助
查看原帖
10分求助
865793
better_Z楼主2024/8/19 21:15
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<time.h>
#define maxn 33
const double D=0.97,EPX=1e-15;
using namespace std;
int A[maxn],B[maxn],n,q,ans,rst,best;
void swapp(int a,int b){
    int tmp=A[a];
    A[a]=B[b];
    B[b]=tmp;
}
int cal(){
    int s1=0,s2=0;
    for(int i=1;i<=n/2;i++)s1+=A[i];
    for(int i=n/2+1;i<=n;i++)s2+=B[i];
        return abs(s1-s2);
}
void SA(){
    rst=0;
    ans=best;
    int x,y;
    for(double T=100000;T>EPX;T*=D){
        x=rand()%(n/2)+1;
        y=rand()%(n-n/2)+(n/2+1);
        swapp(x,y);
        rst=cal();
        if(best>rst)best=rst;
        if(ans>rst||exp(ans-rst)/T>(double)rand()/RAND_MAX)
            ans=rst;
        else swapp(x,y);
    }
}
int main(){
    cin>>q;
    srand(time(0));
    while(q--){
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
        best=ans=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            if(i<=n/2)cin>>A[i];
            else if(i>n/2)cin>>B[i];
        }
        best=ans=cal();
        SA();SA();SA();SA();
        cout<<best<<endl;
    }
    return 0;
}
2024/8/19 21:15
加载中...