题目描述
一数轴上有 n n n 个点,有 n n n 个环,求一种组合方案,使得所有边长度和最小。
Solution 2210 \text{Solution 2210} Solution 2210
很容易想到 随机化 / SA
。
每次 random_shuffle
一个排列,然后判断能否更新答案。注意细节即可。
贴上随机的答案。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#define reg register
int n;
int a[20],b[20],c[20];
int ans=0x3f3f3f3f;
int id[20];
void work(){
for(reg int i=1;i<=n;++i)
id[i]=i;
std::random_shuffle(id+1,id+n+1);
int cnt=0;
for(reg int i=1;i<=n;++i)
cnt+=abs(id[i]-id[a[i]])+abs(id[i]-id[b[i]])+abs(id[i]-id[c[i]]);
cnt>>=1;
if(ans>cnt) ans=cnt;
}
int main(){
srand(233); //233是个很神奇的种子!!!
scanf("%d",&n);
for(reg int i=1;i<=n;++i)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
for(reg int i=1;i<=1e7;++i)
work();
printf("%d",ans);
}