背景:
noip爆炸了,好久没写blog,我又回来了......
题目传送门:
https://www.luogu.org/problemnew/show/P2210
题意:
有n个点,可打乱顺序,求每个点和其配对点间的距离和。
思路:
秒想到随机化,然后这道假深蓝题就AC了。
正解好像是模拟退火(大雾...)/A*。
代码:
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
using namespace std;
int n,ans=2147483647;
int id[20],pos[20];
struct node{int x,y,z;} a[20];
int ran()
{
int tot=0;
random_shuffle(id+1,id+n+1);
for(int i=1;i<=n;i++)
pos[id[i]]=i;
for(int i=1;i<=n;i++)
tot+=abs(pos[i]-pos[a[i].x])+abs(pos[i]-pos[a[i].y])+abs(pos[i]-pos[a[i].z]);
return tot;
}
int main()
{
srand(time(0));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].z);
id[i]=i;
}
for(int i=1;i<=1000000;i++)
ans=min(ans,ran());
printf("%d\n",ans/2);
}