题意:
给一个无序数组,通过一系列对换使之有序。对换的花费是对换两个数的和。问达到目标的最小花费。
思路; 有两种操作:一是可以拿置换中的每一个元素和置换中最小元素依次对换;还可以拿置换中最小元素和序列中最小元素做一次置换,再进行第一种操作。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
vector<pair<int,int> >cows;
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
cows.push_back(make_pair(x,i));
}
sort(cows.begin(),cows.end());
int ans=0,m=cows[0].first;
for(int i=0;i<n;i++)
{
if(cows[i].second==-1)
continue;
int j=cows[i].second,w=cows[i].first,k=1;
cows[i].second=-1;
while(i!=j)//找到一个循环
{
k++;
ans+=cows[j].first;
int t=cows[j].second;
cows[j].second=-1;
j=t;
}
ans+=min((k-1)*w,(k-1)*m+2*(m+w));
}
printf("%d\n",ans);
return 0;
}