%你退火 70pts 求调
  • 板块P1278 单词游戏
  • 楼主loztic
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/15 11:50
  • 上次更新2023/11/15 15:00:59
查看原帖
%你退火 70pts 求调
786972
loztic楼主2023/11/15 11:50
#include<bits/stdc++.h>
using namespace std;
#define delta 0.9975
const int N=20;
int n,ans,p[N];
double t;
struct node{
	string x,y;
	int len;
}mp[N];

int calc(int x[])
{
	int res=mp[x[1]].len;
	for(int i=2;i<=n;i++)
		if(mp[x[i]].x==mp[x[i-1]].y)
			 res+=mp[x[i]].len;
		else break;
	return res;
}

void SA()
{
	int a[N];
	for(int i=1;i<=n;i++)
		a[i]=p[i];
	t=1600;
	while(t>1e-18)
	{
		int b[N];
		for(int i=1;i<=n;i++) b[i]=a[i];
		int x=rand()%n+1;
		int y=rand()%n+1;
		swap(b[x],b[y]);
		int now=calc(b);
		double Delta=now-ans;
		if(Delta>0)
		{
			ans=now;
			for(int i=1;i<=n;i++)
				p[i]=a[i]=b[i];
		}
		else if(exp((double)-Delta/t)*RAND_MAX<rand())
		{
			for(int i=1;i<=n;i++) a[i]=b[i];
		}
		t*=delta;
	}
}

void work()
{
	while((double)clock()/CLOCKS_PER_SEC<=0.97) SA();
}

int main()
{
	srand(time(0));
	cin>>n;
	string s;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		int len=s.length();
		mp[i].len=len;
		mp[i].x=s[0];
		mp[i].y=s[len-1];
	}
	
	for(int i=1;i<=n;i++) p[i]=i;
	ans=calc(p);
	work();
	cout<<ans;
	return 0;
}

2023/11/15 11:50
加载中...