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