有N台机器重量各不相等,现在要求把这些机器按照重量排序,重量从左到右依次递增。移动机器只能做交换操作,但交换机器要花费一定的费用,费用的大小就是交换机器重量的和。例如:3 2 1,交换1 3后为递增排序,总的交换代价为4。给出N台机器的重量,求将所有机器变为有序的最小代价。(机器的重量均为正整数)
Input
第1行:1个数N,表示机器及房间的数量。(2 <= N <= 50000) 第2 - N + 1行:每行1个数,表示机器的重量Wi。(1 <= Wi <= 10^9)
Output
输出最小代价。
Input示例
3 3 2 1
Output示例
4
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int ll;
const int MAXN = 50005;
int n;
struct Node
{
int pos;
int weight;
};
Node a[MAXN];
ll result = 0;
bool cmp(const Node &left, const Node &right)
{
return left.weight < right.weight;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].weight;
a[i].pos = i;
}
sort(a, a + n, cmp);
ll globalLeast = a[0].weight;
for (int i = 0; i < n; i++)
{
if (i != a[i].pos)
{
int count = 0;
ll total = 0;
ll localLeast = a[i].weight;
while (i != a[i].pos)
{
count++;
total += a[a[i].pos].weight;
int temp = a[a[i].pos].pos;
a[a[i].pos].pos = a[i].pos;
a[i].pos = temp;
}
ll c = total + localLeast * count;
ll d = total + globalLeast * (count + 2) + 2 * localLeast;
result += min(c, d);
}
}
cout << result << endl;
return 0;
}