poj 3270
注意离散化。
代码:
#include<iostream> #include<fstream> using namespace std; int n; int a[10001]; int v[10001]; int b[10001]; int c[1000001]; int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b; } void read(){ // ifstream cin("in.txt"); int i,j,k=100001,ans=0,sum,minn,s,num; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); k=min(k,a[i]);b[i]=a[i]; } qsort(b+1,n,sizeof(int),cmp); for(i=n;i>=1;i--) c[b[i]]=i; for(i=1;i<=n;i++) if(v[i]==0&&i!=c[a[i]]) { num=1; minn=a[i]; v[c[a[i]]]=1; sum=a[i]; s=c[a[i]]; while(c[a[s]]!=i) { sum+=a[s]; num++; minn=min(a[s],minn); v[c[a[s]]]=1; s=c[a[s]]; } num++; minn=min(a[s],minn); sum+=a[s]; v[i]=1; ans+=min(sum+(num-2)*minn,sum+minn+(num+1)*k); } cout<<ans<<endl; } int main(){ read(); return 0; }