実際には、この問題になりました。。。形而上学的な解決策があります
これは、このタイトルの最小配列の要件であります
まあ、我々はAにないと思います明らかに書き込み
それはありますrandom_shuffle
何?これは、非正ソリューションファックことではありません
しかし、それは良いが言うように
あなたは間違っに彼のカードを使うことはできません場合、アルゴリズムは、その後、彼は正しいです
だから、それは次のように作成し、科学ランダム書き込み
無作為化順序は、シミュレーションは、最小値ANSを取ります
コード
#include<bits/stdc++.h>
using namespace std;
const int MAXN=20;
void file(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
int read()
{
int f=1,a=0;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
a=a*10+ch-'0';
ch=getchar();
}
return a*f;
}
int n,ans=0x3f3f3f3f;
int a[MAXN],fri[MAXN][MAXN];
int main()
{
// file("");
n=read();
for(int i=1;i<=n;++i){
int x=read(),y=read(),z=read();
fri[i][x]=fri[i][y]=fri[i][z]=1;
a[i]=i;
}
for(int i=1;i<=300000;++i){
random_shuffle(a+1,a+n+1);
int re=0;
for(int j=1;j<=n;++j){
for(int k=j+1;k<=n;++k){
int pos1,pos2;
if(!fri[j][k]){
continue;
}
for(int l=1;l<=n;++l){
if(a[l]==j){
pos1=l;
}
if(a[l]==k){
pos2=l;
}
}
re+=abs(pos1-pos2);
}
}
ans=min(ans,re);
}
cout<<ans<<endl;
return 0;
}
LBN @expectの文言が強すぎるorzorzことを教えてくれました
このような勧告があってもよいです科学的なソリューションランダム化ファックトピック:
同期が発生してこの記事の私Luoguのブログには、この兄Taccaローリングへようこそ