The Rank [ Codeforces Round #502 Div.1+Div.2 A ]
問題
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); } }