版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37428263/article/details/86489447
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int>PII;
int main()
{
int n;
scanf("%d",&n);
vector<PII>vec;
vec.clear();
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
vec.push_back(PII(k,i));
}
sort(vec.begin(),vec.end());
int M=vec[0].first,solve=0;
for(int i=0;i<n;i++)
{
if(vec[i].second==-1) continue;
int j=vec[i].second,m=vec[i].first,k=1; //原来位置 当前循环节极小值
vec[i].second=-1;
while(j!=i)
{
k++;
int t=vec[j].second;
solve+=vec[j].first;
vec[j].second=-1;
j=t;
}
solve+=min((k-1)*m,(k-1)*M+2*(m+M));
}
printf("%d\n",solve);
return 0;
}