公式

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

GPT 5.2 High

概要

各参加者の最終スコア \(A_i + B_i\) を計算し、その値が最大となる参加者番号を求める問題です。

考察

  • 最終スコアは単純に \(A_i + B_i\) なので、全員について合計点を計算し「最大値」を探せばよいです。
  • 「最大の人はちょうど1人」と保証されているため、同点処理(複数候補の扱い)を考える必要がありません。
  • 素朴に全員の \(A_i,B_i\) を配列に保存してから最大を探しても \(O(N)\) で間に合いますが、保存せずに読みながら最大を更新すれば、よりシンプルでメモリも節約できます。
  • \(N \le 2 \times 10^5\) なので、ループで1回ずつ処理する方法が最も確実です(全探索で十分高速)。

例: - 参加者1: \(A_1=30, B_1=40 \Rightarrow 70\) - 参加者2: \(A_2=50, B_2=10 \Rightarrow 60\) - 参加者3: \(A_3=20, B_3=80 \Rightarrow 100\)
最大は100なので答えは3。

アルゴリズム

  1. 変数 best_sum(これまでの最大合計点)と best_idx(その参加者番号)を用意する。
  2. \(i=1\) から \(N\) まで順に \((A_i, B_i)\) を読み込み、\(s = A_i + B_i\) を計算する。
  3. もし \(s > best_sum\) なら、best_sum = sbest_idx = i に更新する。
  4. 全員見終わったら best_idx を出力する。

計算量

  • 時間計算量: \(O(N)\)(各参加者を1回ずつ処理)
  • 空間計算量: \(O(1)\)(最大値と番号だけ保持。入力全体を配列に保存しない)

実装のポイント

  • 参加者番号は問題文どおり 1始まり なので、ループも for i in range(1, n + 1) のように書くとズレを防げます。

  • Pythonでは入力が大きいと input() を繰り返すより、sys.stdin.buffer.read().split() でまとめて読み取ると高速です(提出コードはこの方式)。

    ソースコード

import sys

def main():
    it = iter(sys.stdin.buffer.read().split())
    n = int(next(it))
    best_sum = -1
    best_idx = -1
    for i in range(1, n + 1):
        a = int(next(it))
        b = int(next(it))
        s = a + b
        if s > best_sum:
            best_sum = s
            best_idx = i
    print(best_idx)

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

投稿日時:
最終更新: