已AC,但是有一个地方不清楚
#include<bits/stdc++.h>
#define maxn 50010
#define ll long long
using namespace std;
#define int long long
int A,suml,sumr,n,a[maxn],ans;
const double begt=11437.7870,//初温
endt=1e-18,//结束温度
ct=0.99;//温度变化系数
double T;
void SA(){
T=begt;
while(T>endt){
int x=0,y=0;
int m=n/2;
if(m==0)m++;
x=rand()%m+1;//x为[1,2/n]
y=rand()%((n+1)/2)+(n/2)+1;//y为[(n+1)/2,n]
suml-=a[x];suml+=a[y];sumr-=a[y];sumr+=a[x];
swap(a[x],a[y]);
int now=abs(suml-sumr);
if(now<=ans)ans=now;
else if(exp((ans-now)/T)<(double)rand()/RAND_MAX){suml-=a[x];suml+=a[y];sumr-=a[y];sumr+=a[x];swap(a[x],a[y]);}
T*=ct;
}
}
signed main(){
srand(time(0));
cin>>A;
while(A--){
suml=0;sumr=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i<=n/2)suml+=a[i];
else sumr+=a[i];
}
ans=abs(suml-sumr);
for(int i=1;i<=50;i++)SA();
cout<<ans;puts("");
}
return 0;
}
其中,这个地方不太清楚为什么
if(now<=ans)ans=now;
else if(exp((ans-now)/T)<(double)rand()/RAND_MAX){suml-=a[x];suml+=a[y];sumr-=a[y];sumr+=a[x];swap(a[x],a[y]);}
玄关