文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

The Rank [ Codeforces Round #502 Div.1+Div.2 A ]

codeforces.com


問題

1~n のIDを持った生徒が合計で n 人いる。
それらの生徒の 4教科のスコア が ID の小さい順に与えられる。


ID が 1 である生徒の成績(4教科の合計スコア)は上から何番目か、出力せよ。
ただし、スコアが同じ場合は ID が小さいほうを上の順位とする。


考察

クラス、そしてクラスが格納されている配列をフィールド別にソートする方法を知っていると、
簡単に解くことができます。


今回は、生徒の ID,スコア を格納するために以下の Student クラスを定義しました。

class Student {
	int id;
	int score;
	Student (int i, int s) {
		id = i; score = s;
	}
	int getId () {
		return id;
	}
	int getScore () {
		return score;
	}
}


getter をわざわざ用意した理由は、ソートの際に使用するからです。
どのように使用しているかは、以下の解答コードをご覧ください。


コード

void solve (FastScanner in, PrintWriter out) {
	
	int n = in.nextInt();
	Student[] students = new Student[n];
	for (int i=0; i<n; i++) {
		students[i] = new Student(i+1, in.nextInt() + in.nextInt() + in.nextInt() + in.nextInt());
	}
	
	Arrays.sort(students, Comparator
			.comparing(Student::getScore).reversed() //scoreで降順ソート
			.thenComparing(Student::getId)); //scoreが同じ場合はidで昇順ソート
	
	for (int i=0; i<n; i++) {
		if (students[i].id == 1) out.println(i+1);
	}
	
}