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;
}
浙公网安备 33010602011771号