再调下去出人命了
查看原帖
再调下去出人命了
294562
EDqwq楼主2020/8/18 21:40

模拟退火后三点WA 已经交了一页多了

#include<bits/stdc++.h>

#define int long long
#define down 0.912

using namespace std;

int t,n,mid;
int a[1000],s1,s2,ans,odd;

int read(){
    int w = 1, q = 0;
    char ch = ' ';
    while(ch != '-' && (ch < '0' || ch > '9'))ch = getchar();
    if(ch == '-')w = -1, ch = getchar();
    while(ch >= '0' && ch <= '9')q = q * 10 + ch - '0', ch = getchar();
    return w * q;
}

void sa(){
	double te = 4649;
	while(te > 1e-10){
		int x = (int)(rand()) % mid + 1;
		int y = n - (int)(rand()) % (mid + odd);
		int dis = abs(s1 - a[x] * 2 + a[y] * 2 - s2);
		double d = dis - ans;
		if(d < 0){
			ans = dis;
			s1 = s1 - a[x] + a[y];
			s2 = s2 - a[y] + a[x];
			swap(a[x],a[y]);
		}
		else if(exp((d / te)) < rand() % 32768){
			s1 = s1 - a[x] + a[y];
			s2 = s2 - a[y] + a[x];
			swap(a[x],a[y]);
		}
		te *= down;
	}
}

signed main(){
	srand(time(0));
	cin>>t;
	while(t --){
		n = read();
		mid = n / 2;
		odd = n % 2;
		s1 = s2 = 0;
		for(int i = 1;i <= n;i ++){
			a[i] = read();
			if(i <= mid)s1 += a[i];
			else s2 += a[i];
		}
		if(n == 1){
			cout<<a[1];
			continue;
		}
		ans = abs(s1 - s2);
		for(int i = 1;i <= 667;i ++)sa();
  		printf("%d\n",ans);
	}
	return 0;
}

为了挽救蒟蒻的生命,请高抬贵手帮助一下我

2020/8/18 21:40
加载中...