最后三个点过不了~
#include<bits/stdc++.h>
using namespace std;
const int N=40;
const long double D=0.9993554,EPS=1e-3;
int n,mid;
int o,size_l,size_r;
long long int best;
long long int v[N];
void SA() {
for(long double T=2021; T>EPS; T*=D) {
long int x=rand()%mid+1,y=rand()%(mid+o)+1+mid;
long long dis=abs(size_l-(v[x]<<1)+(v[y]<<1)-size_r);
double RES=dis-best;
if(RES<0){
best=dis;
size_l+=v[y]-v[x];
size_r+=v[x]-v[y];
swap(v[x],v[y]);
}
else if(exp(RES/T)<rand()%114514){
size_l+=v[y]-v[x];
size_r+=v[x]-v[y];
swap(v[x],v[y]);
}
}
}
int main() {
int K;
scanf("%d",&K);
srand(725901);
srand(rand());
while(K--) {
int times=20;
scanf("%d",&n);
mid=n/2,o=n%2,size_l=size_r=0;
for(int i=1; i<=n; i++) {
scanf("%lld",&v[i]);
i<=mid?size_l+=v[i]:size_r+=v[i];
}
if(n==1) {
printf("%lld",v[1]);
continue;
}
best=abs(size_l-size_r);
while(times--)SA();
printf("%lld\n",best);
}
return 0;
}
ORZ