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

posted on 2011-04-11 14:04  宇宙吾心  阅读(179)  评论(0)    收藏  举报

导航