模拟退火 WA 70pts 悬棺求调
查看原帖
模拟退火 WA 70pts 悬棺求调
1400210
ty22caolongjun楼主2024/8/8 16:47

前7个点稳过,#8 9 10 一直WA (Windows下倒数第5行800000记得改成800)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int v[1005];
int n,ans;
int cal(){
	int sum1=0,sum2=0;
	for(int i=1;i<=(n+1)/2;i++) sum1+=v[i];
	for(int i=(n+1)/2+1;i<=n;i++) sum2+=v[i];
	return abs(sum1-sum2);
}
void SA(){
	int T=5000;
	while(T>1e-15){
		int a=rand()%n+1,b=rand()%n+1;
		swap(v[a],v[b]);
		int dw=cal();
		int de=dw-ans;
		if(de<0) ans=dw;
		else if(exp(-de/T)*RAND_MAX<rand()) swap(v[a],v[b]);
		T*=0.9112;
	}
}
signed main(){
	int t;
	scanf("%lld",&t);
	for(int k=1;k<=t;k++){
		scanf("%lld",&n);
		srand(time(0));
		int st=clock();
		for(int i=1;i<=n;i++) scanf("%lld",&v[i]);
		if(n==0){
			printf("0");
			break;
		}
		if(n==1){
			printf("%lld\n",v[1]);
			break;
		}
		ans=cal();
		while(clock()-st<800000/t) SA();
		printf("%lld\n",ans);
	}
	return 0;
}
2024/8/8 16:47
加载中...