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 JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.Comparator;

class TrackRecord
{
    private int id;
    private float tm;

    public TrackRecord(int id, float tm)
    {
	this.id = id;
	this.tm = tm;
    }

    public int getId()
    {
	return this.id;
    }

    public float getTm()
    {
	return this.tm;
    }

    public int setId(int id)
    {
	return this.id = id;
    }

    public float setTm(float tm)
    {
	return this.tm = tm;
    }
}

public class Main
{

    public static void main(String[] args)
    {
	final int nRec=24;
	Scanner scan = new Scanner(System.in);
	TrackRecord[] rec = new TrackRecord[nRec];

	try{
	    for (int i=0; i<nRec; i++){
		int id = scan.nextInt();
		Float tm = scan.nextFloat();
		try {
		    rec[i] = new TrackRecord(id,tm);
		} catch(NullPointerException e){
		    System.out.println("NPE:"+e+" i="+i);
		}
	    }
	} catch (InputMismatchException e){
	    System.out.println("Wrong Type"+e);
	}
	
	TrackRecord[] g1 = new TrackRecord[8];
	g1 = Arrays.copyOfRange(rec, 0, 8);
	TrackRecord[] g2 = new TrackRecord[8];
	g2 = Arrays.copyOfRange(rec, 8, 16);
	TrackRecord[] g3 = new TrackRecord[8];
	g3 = Arrays.copyOfRange(rec, 16, 24);

        Arrays.sort(g1, new Comparator<TrackRecord>() {
		public int compare(TrackRecord record1, TrackRecord record2) {
		    return (int)(record1.getTm()*100) - (int)(record2.getTm()*100);
		}
	    });

        Arrays.sort(g2, new Comparator<TrackRecord>() {
		public int compare(TrackRecord record1, TrackRecord record2) {
		    return (int)(record1.getTm()*100) - (int)(record2.getTm()*100);
		}
	    });
        Arrays.sort(g3, new Comparator<TrackRecord>() {
		public int compare(TrackRecord record1, TrackRecord record2) {
		    return (int)(record1.getTm()*100) - (int)(record2.getTm()*100);
		}
	    });
	ArrayList<TrackRecord> ans = new ArrayList<TrackRecord>(); 
	ans.add(g1[0]);
	ans.add(g1[1]);
	ans.add(g2[0]);
	ans.add(g2[1]);
	ans.add(g3[0]);
	ans.add(g3[1]);

	TrackRecord[] rec1 = new TrackRecord[nRec-6];
	for (int i=0; i<6; i++){
	    rec1[i] = g1[i+2];
	}
	for (int i=0; i<6; i++){
	    rec1[i+6] = g2[i+2];
	}
	for (int i=0; i<6; i++){
	    rec1[i+12] = g3[i+2];
	}

        Arrays.sort(rec1, new Comparator<TrackRecord>() {
		public int compare(TrackRecord record1, TrackRecord record2) {
		    return(int)(record1.getTm()*100) - (int)(record2.getTm()*100);
		}
	    });

	ans.add(rec1[0]);
	ans.add(rec1[1]);
	for (int i=0; i<ans.size(); i++){
	    System.out.printf("%d %.2f\n", ans.get(i).getId(), ans.get(i).getTm()); 
	}
    }

}