Problem:
Score : 200 points

Problem Statement

Snuke is having a barbeque party.

At the party, he will make N servings of Skewer Meal.

Example of a serving of Skewer Meal

He has a stock of 2N skewers, all of which will be used in Skewer Meal. The length of the i-th skewer is L_i.
Also, he has an infinite supply of ingredients.

To make a serving of Skewer Meal, he picks 2 skewers and threads ingredients onto those skewers.
Let the length of the shorter skewer be x, then the serving can hold the maximum of x ingredients.

What is the maximum total number of ingredients that his N servings of Skewer Meal can hold, if he uses the skewers optimally?

Constraints

1≦N≦100

1≦L_i≦100

For each i, L_i is an integer.

Input

The input is given from Standard Input in the following format:

N
L_1 L_2 ... L_{2N}

Output

Print the maximum total number of ingredients that Snuke's N servings of Skewer Meal can hold.

Sample Input 1

2
1 3 1 2

Sample Output 1

3

If he makes a serving using the first and third skewers, and another using the second and fourth skewers, each serving will hold 1 and 2 ingredients, for the total of 3.

Sample Input 2

5
100 1 2 3 14 15 58 58 58 29

Sample Output 2

135

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

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

namespace ConsoleApp1
{
    public class node
    {
        public List<node> connect = new List<node>();
        public int index;
    }
    class Program
    {
        static void Main(string[] args)
        {
            var temp = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray();
            var n = temp[0];
            var k = temp[1];

            node[] nodes = Enumerable.Range(1, (int)n+1).Select(x => new node { index = x }).ToArray();

            int[] a = new int[n + 1];
            int[] b = new int[n + 1];
            for (int i = 1; i < n; i++)
            {
                var t= Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
                a[i] = t[0];
                b[i] = t[1];
                nodes[a[i]].connect.Add(nodes[b[i]]);
                nodes[b[i]].connect.Add(nodes[a[i]]);
            }
            int ans = int.MaxValue;
            if (k%2==0)ans = (int)n - nodes.Select(x => search(x, null, (int)k/2)).Skip(1).Max();
            else
            {
                int[] temp1 = nodes.Select(x => search(x, null, (int)(k - 1) / 2)).ToArray();
                
                for (int i = 1; i < nodes.Length; i++)
                {
                    temp1[i] += nodes[i].connect.Select(x => search_l(x, nodes[i], ((int)k + 1) / 2)).Max();
                }

                ans = (int)n - temp1.Skip(1).Max();                
            }
            Console.WriteLine(ans);
        }

        /// <summary>k個以内のノード数(自分含めて)</summary>
        static int search(node node,node pre, int k)
        {
            if (k == 0) return 1;
            return node.connect.Where(x => x != pre).Select(x => search(x, node, k - 1)).Sum() + 1;
        }
        /// <summary>
        /// 距離nのノード数
        /// </summary>
        static int search_l(node node, node pre, int k)
        {
            if (k == 0) return 1;
            return node.connect.Where(x => x != pre).Select(x => search_l(x, node, k - 1)).Sum();
        }
    }
}