题解 P2210 【Haywire】

luogu

思路

模拟退火大法好,1发A掉
此题用模拟退火随机交换即可,数据太水

Code

#include<bits/stdc++.h>
using namespace std;
int n,arr[15][4],grass[15],ans=0x7f7f7f;
int ip;
double T;
double eps=1e-5;
double xs=0.999;
int get_cost()
{
	int tans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=3;j++)
		{
            tans+=abs(grass[i]-grass[arr[i][j]]);
        }
	}
	return tans;
}
void SA()
{
	T=10000;
	while(T>eps)
	{
		int x=rand()%n+1;
		int y=rand()%n+1;
		swap(grass[x],grass[y]);
		int now=get_cost();
		int Delta=now-ans;
		if(Delta<=0)
		{
			ans=now;
		}
		else
		{
			if(exp(-Delta)/T>rand()/RAND_MAX)
			{
				swap(grass[x],grass[y]);
			}
		}
		T*=xs;
	}
}
void work()
{
	for(int i=1;i<=n;i++)
	{
		SA();
	}
}
int main()
{
	srand(time(NULL));srand(rand());srand(rand());
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=3;j++)
		{
			cin>>ip;
			arr[i][j]=ip;
		}
		grass[i]=i;
	}
	work();
	cout<<ans/2;
}
posted @ 2019-07-27 10:10  G_A_TS  阅读(289)  评论(0编辑  收藏  举报