我的退火怎么了?提交140+才70分!
查看原帖
我的退火怎么了?提交140+才70分!
289436
LZX_ssfd楼主2021/11/17 15:34

最后三个点过不了~

#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

2021/11/17 15:34
加载中...