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 回ずつ見ていく単純なループで十分間に合います。
アルゴリズム
- 最大スコア
best_scoreを \(-1\)(十分小さい値)で初期化し、対応する参加者番号best_idxも初期化する。 - 参加者 \(i = 1, 2, \dots, N\) について順に \(A_i\) と \(B_i\) を読み込み、\(A_i + B_i\) を計算する。
- もし \(A_i + B_i\) がこれまでの
best_scoreより大きければ、best_scoreとbest_idxを更新する。 - 全参加者を処理した後、
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: