Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Minimum Cost Sort

You are given $n$ integers $w_i (i = 0, 1, ..., n-1)$ to be sorted in ascending order. You can swap two integers $w_i$ and $w_j$. Each swap operation has a cost, which is the sum of the two integers $w_i + w_j$. You can perform the operations any number of times.

Write a program which reports the minimal total cost to sort the given integers.

Input

In the first line, an integer $n$ is given. In the second line, $n$ integers $w_i (i = 0, 1, 2, ... n-1)$ separated by space characters are given.

Output

Print the minimal cost in a line.

Constraints

$1 \leq n \leq 1,000$

$0 \leq w_i\leq 10^4$

$w_i$ are all different

Sample Input 1

5
1 5 3 4 2

Sample Output 1

7

Sample Input 2

4
4 3 2 1

Sample Output 2

10

Solution in C# (judge verdict: Time Limit Exceeded)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace aizu1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int[] w = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int[] k =new int[n];

            k = w.Clone() as int[];

            Array.Sort(k);

            int cost = 0;
            int minCost = int.MaxValue;

            minCost = findMin(w,k,n,cost, ref minCost);

            Console.WriteLine(minCost);
        }

        static int findMin(int[] w,int []k,int n, int cost, ref int minCost)
        {
            if (n ==1) minCost= minCost>cost?cost:minCost;

            if(n==2)
            {
                int a = 0, b = 0;
                for(int i=0;i<k.Length;i++)
                {
                    if (k[i] != -1 && a == 0) a = k[i];
                    else if (k[i] != -1) b = k[i];

                }
                int aP = findP(a, w);
                int bP = findP(b, w);
                cost += (aP > bP) ? a + b : 0;
                minCost= minCost > cost ? cost : minCost;
                cost -= (aP > bP) ? a + b : 0;
            }

            for(int i=k.Length-1;i>=1;i--)
            {
                if (k[i] == -1) continue;
                int p = findP(k[i], w);

                if (p != i)
                {
                    int t = w[i];
                    w[i] = w[p];
                    w[p] = t;
                    k[i] = -1;
                    cost = cost + w[i] + w[p];
                    findMin(w, k, n - 1, cost, ref minCost);
                    t = w[i];
                    w[i] = w[p];
                    w[p] = t;
                    k[i] = w[p];
                    cost = cost - w[i] - w[p];
                }
                else
                {
                    k[i] = -1;
                    findMin(w, k, n - 1, cost, ref minCost);
                    k[i] = w[p];
                }
            }

            return minCost;
            
        }

        static int findP(int t,int [] w)
        {
            for (int i = 0; i < w.Length; i++)
                if (t == w[i]) return i;
            return 0;
        }
    }
}