Problem:
陸上競技大会

陸上競技大会 200M の準決勝 3 組のレースが行われました。それぞれの組に 8 名（計 24 名）の選手が出場します。各組上位 2 位までの選手と、各組の 3 位以下の全選手の中から上位 2 名の計 8 名が決勝に進出します。

選手番号とタイムを入力とし、決勝進出者 8 名の番号とそのタイムを出力するプログラムを作成してください。

Input

入力は以下の形式で与えられます。

p1 t1
p2 t2
:
p24 t24

1 行目から 8 行目に１組目の選手番号 pi (整数、1 ≤ pi ≤ 10000) とタイム ti (1/100 まで計測した実数、1 ≤ ti ≤ 100)、9 行目から 16 行目に２組目の選手番号 pi とタイム ti、17 行目から 24 行目に３組目の選手番号 pi とタイム ti が与えられます。同じ選手番号の選手、同タイムの選手はいないものとします。

Output

以下の順番で、決勝進出者の選手番号とタイムを空白区切りでそれぞれ１行に出力してください。

1 組目の 1 位の選手

1 組目の 2 位の選手

2 組目の 1 位の選手

2 組目の 2 位の選手

3 組目の 1 位の選手

3 組目の 2 位の選手

各組で 3 位以下の選手の中でタイムが 1 位の選手

各組で 3 位以下の選手の中でタイムが 2 位の選手

Sample Input

18 25.46
16 26.23
3 23.00
10 24.79
5 22.88
11 23.87
19 23.90
1 25.11
23 23.88
4 23.46
7 24.12
12 22.91
13 21.99
14 22.86
21 23.12
9 24.09
17 22.51
22 23.49
6 23.02
20 22.23
24 21.89
15 24.14
8 23.77
2 23.42

Output for the Sample Input

5 22.88
3 23.00
13 21.99
14 22.86
24 21.89
20 22.23
17 22.51
12 22.91

Solution in C# (judge verdict: Accepted)

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

namespace Train {
    class Class2 {
        const string mark = "*";

        static void Main(string[] args) {
            new Class2().solve();
        }
        void solve() {
            List<double[][]> allResult = new List<double[][]>();

            double[][] heatResult = new double[8][];
            for (int i = 0; i < heatResult.Length; i++) {
                heatResult[i] = new double[2];
            }

            for (int num = 0; num < 24; num++) {
                string data = Console.ReadLine();
                string[] spritData = data.Split(' ');

                for (int i = 0; i < 2; i++) {
                    heatResult[(num+1)%8][i] = double.Parse(spritData[i]);
                }
                if ((num+1) % 8 == 0) {
                    allResult.Add((double[][])heatResult.Clone());
                    for (int i = 0; i < heatResult.Length; i++) {
                        heatResult[i] = new double[2];
                    }
                }
            }
            for (int count = 0; count < allResult.Count; count++) {
                Array.Sort(allResult[count],compareArray);
            }

            string[][] finalist = new string[8][];
            for (int i = 0; i < finalist.Length; i++) {
                finalist[i] = new string[2];
            }

            int number = 0;
			for (int count = 0; count < allResult.Count; count++) {
                for (int i = 0; i < 2; i++) {
                    int a = (int)allResult[count][i][0];
                    finalist[number][0] = a.ToString();
                    finalist[number][1] = allResult[count][i][1].ToString("G4");
                    number++;
                }
            }

            double[][] thirds = new double[3][];
            for (int i = 0; i < allResult.Count; i++) {
                thirds[i] = allResult[i][2];
            }
            Array.Sort(thirds,compareArray);
            for (int i = 0; i < 2; i++) {
                int a = (int)(int)thirds[i][0];
                finalist[number][0] = a.ToString();
                finalist[number][1] = thirds[i][1].ToString("G4");
                number++;
            }

            for (int i = 0; i < finalist.Length; i++) {
                Console.WriteLine(finalist[i][0]+" "+finalist[i][1]);
            }
        }

        int compareArray(double[] a, double[] b) {
            if (a[1] > b[1]) {
                return 1;
            } else if (a[1] < b[1]) {
                return -1;
            }
            return 0;
        } 
    }
}