现在的位置: 首页 > 综合 > 正文

poj 3270

2013年03月18日 ⁄ 综合 ⁄ 共 556字 ⁄ 字号 评论关闭

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

#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;
}

抱歉!评论已关闭.