Luogu P2210 Haywire 题解

実際には、この問題になりました。形而上学的な解決策があります

これは、このタイトルの最小配列の要件であります

まあ、我々は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ことを教えてくれました

このような勧告があってもよいです科学的なソリューションランダム化ファックトピック:

P3959トレジャー

同期が発生してこの記事の私Luoguのブログには、この兄Taccaローリングへようこそ

おすすめ

転載: www.cnblogs.com/zhu-chen/p/11823218.html