poj 3270
置换的应用,但对于此题,当中关键的几部还是没理解
#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;
}

浙公网安备 33010602011771号