Official

B - 料理コンテスト / Cooking Contest Editorial by admin

Claude 4.6 Opus (Thinking)

概要

\(N\) 人の参加者それぞれについて、2人の審査員がつけた点数の合計(最終スコア)を求め、最終スコアが最も高い参加者の番号を出力する問題です。

考察

この問題は非常にシンプルで、各参加者の \(A_i + B_i\) を計算し、その最大値を持つ参加者の番号を見つければよいです。

例えば、\(N = 3\) で以下の入力が与えられた場合を考えます。

参加者 \(A_i\) \(B_i\) 最終スコア \(A_i + B_i\)
1 50 60 110
2 80 90 170
3 70 80 150

最終スコアが最も高いのは参加者 2(スコア 170)なので、答えは 2 です。

この問題では \(N\) が最大 \(2 \times 10^5\) ですが、各参加者について足し算と比較を 1 回ずつ行うだけなので、特別なアルゴリズムは不要です。全参加者を 1 回ずつ見ていく単純なループで十分間に合います。

アルゴリズム

  1. 最大スコア best_score\(-1\)(十分小さい値)で初期化し、対応する参加者番号 best_idx も初期化する。
  2. 参加者 \(i = 1, 2, \dots, N\) について順に \(A_i\)\(B_i\) を読み込み、\(A_i + B_i\) を計算する。
  3. もし \(A_i + B_i\) がこれまでの best_score より大きければ、best_scorebest_idx を更新する。
  4. 全参加者を処理した後、best_idx を出力する。

これは「最大値を求める」という基本的な処理そのものです。配列に全データを格納してから最大値を探す方法でも構いませんが、読み込みながら逐次比較する方がメモリ効率が良いです。

計算量

  • 時間計算量: \(O(N)\) — 各参加者を 1 回ずつ処理するため
  • 空間計算量: \(O(1)\) — 最大スコアとその番号のみを保持するため(入力データを配列に保存しない)

実装のポイント

  • 参加者の番号は 1-indexed(1 から始まる)であることに注意してください。Python の range でループする際に range(1, N + 1) とすることで、参加者番号をそのまま扱えます。

  • best_score の初期値は、あり得る最小スコア(\(1 + 1 = 2\))より小さい値であれば何でも構いません。コードでは \(-1\) を使っています。

  • 問題文で「最終スコアが最も高い参加者はちょうど 1 人」と保証されているため、同点処理を考える必要はありません。

    ソースコード

N = int(input())
best_score = -1
best_idx = -1
for i in range(1, N + 1):
    a, b = map(int, input().split())
    if a + b > best_score:
        best_score = a + b
        best_idx = i
print(best_idx)

この解説は claude4.6opus-thinking によって生成されました。

posted:
last update: