poj 3270

来源:互联网 发布:重庆忽米网络 编辑:程序博客网 时间:2024/05/29 06:54

置换的应用,但对于此题,当中关键的几部还是没理解

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=10000+10;int f1[maxn],f2[maxn],vis[100000+10],loc[100000+10];int main(){    int n;    cin>>n;    int i,j;    for(i=0;i<n;i++)    {        scanf("%d",&f1[i]);        loc[f1[i]]=i;        f2[i]=f1[i];    }    sort(f2,f2+n);    int minv,tem=0,ans=0,l;    for(i=0;i<n;i++)    {        if(!vis[f1[i]])        {            vis[f1[i]]=1;            minv=1000000;            tem=f1[i];l=1;            tem=f1[i];            if(f1[i]<minv) minv=f1[i];            int k=f2[i];            while(k!=f1[i])            {                vis[k]=1;                tem+=k;                l++;                if(k<minv)                    minv=k;                k=f2[loc[k]];            }            ans=ans+tem+min((l-2)*minv,minv+(l+1)*f2[0]);        }    }    printf("%d\n",ans);    return 0;}


原创粉丝点击