有大佬帮忙看看吗
查看原帖
有大佬帮忙看看吗
519384
Link_Cut_Y楼主2022/3/13 17:28
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <ctime>
#include <cmath>
#define int long long

using namespace std;

using namespace std;

const int N = 1010;

int a[N], n;
int path[N], p[N];
int res = 0;

void copy()
{
	for (int i = 1; i <= n; i ++ ) path[i] = p[i];
}

int calc()
{
	p[0] = p[n], p[n + 1] = p[1];
	int cnt = 0;
	for (int i = 1; i <= n; i ++ )
		cnt += p[i] * a[p[i - 1]] * a[p[i]] * a[p[i + 1]];
		
	if (cnt > res) res = cnt, copy();
	return cnt;
}

void sumilate_anneal()
{
	for (double t = 1e4; t >= 1e-4; t *= 0.999)
	{
		int x = calc();
		int a = rand() % n + 1, b = rand() % n + 1;
		swap(p[a], p[b]);
		int y = calc();
		int delta = y - x;
		if (exp(delta / t) < (double)rand() / RAND_MAX) swap(p[a], p[b]);
	}
}

signed main()
{
	srand(time(0));
	
	scanf("%lld", &n);
	
	for (int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]);
	for (int i = 1; i <= n; i ++ ) p[i] = i;
	
	while ((double)clock() / CLOCKS_PER_SEC < 0.98)
	{
		random_shuffle(p + 1, p + n + 1);
		sumilate_anneal();
	}
	
	for (int i = 1; i <= n; i ++ )
		printf("%lld ", path[i]);
		
	return 0;
} 
2022/3/13 17:28
加载中...