提供退火参数
  • 板块P1220 关路灯
  • 楼主ZepX_D
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/8/23 19:30
  • 上次更新2023/11/3 01:40:59
查看原帖
提供退火参数
464004
ZepX_D楼主2023/8/23 19:30

rt,还挺难调的

#include <bits/stdc++.h>

using namespace std;

int p[51],w[51],s[51],n,sum,ans = 2e9;
bool vis[51];

int W()
{
	int res = 0,tmp = sum;
	for (int i = 2;i <= n;i++)
		res += tmp*abs(p[s[i]]-p[s[i-1]]),tmp -= w[s[i]];
	ans = min(ans,res);
	return res;
}

void sa()
{
	double T = 1145;
	while(T > 1e-9)
	{
		int x = rand()%(n-1)+2,y = rand()%(n-1)+2;
		if (x == y) continue;
		int k = W();swap(s[x],s[y]);
		int now = W(),del = now-k;
		if (del > 0 && exp(-del/T)*RAND_MAX < rand()) swap(s[x],s[y]);
		T *= 0.99;
	}
}

int main()
{
	int c;cin >> n >> c;
	for (int i = 1;i <= n;i++)
		cin >> p[i] >> w[i],sum += w[i];
	s[1] = c;vis[c] = 1;
	for (int i = 2;i <= n;i++)
	{
		int tmp = 2e9,pos;s[i] = s[i-1];
		for (int j = 1;j <= n;j++)
		{
			if (vis[j]) continue;
			if (abs(p[j]-p[s[i]]) < tmp)
				tmp = abs(p[j]-p[s[i]]),pos = j;
		}
		vis[s[i] = pos] = 1;
	}
	sum -= w[s[1]],ans = W();
	while(clock()*1.0/CLOCKS_PER_SEC < 0.95) sa();
	cout << ans;
	return 0;
}
2023/8/23 19:30
加载中...