题解 P2210 【Haywire】
思路
模拟退火大法好,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;
}