Official

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

Qwen3-Coder-480B

概要

高橋君と青木君がそれぞれ付けた点数の合計が最も高い参加者の番号を求めます。

考察

各参加者 \(i\) に対して、高橋君の点数 \(A_i\) と青木君の点数 \(B_i\) が与えられ、最終スコアは \(A_i + B_i\) で求められます。この中で最大の値を持つ参加者を特定すれば良いです。

素朴な方法として、すべての参加者の点数を配列に保存してから最大値を探索することも考えられますが、参加者数 \(N\) は最大で \(2 \times 10^5\) なので、特にメモリや二重ループを使えばTLEの原因になります。しかし、今回は各参加者の点数を読みながらその場で最大値を更新していくことで、配列を保持する必要がなくなり、効率的に解くことができます。

この解法では、点数を読み込むたびに現在の最大スコアと比較し、より高いスコアがあればそれを新しい最大スコアとして記録し、同時にその参加者の番号も記録しておきます。

アルゴリズム

  1. 最大スコア max_score を非常に小さい値(例えば \(-1\))で初期化します。
  2. 優勝者の番号 winner も同様に初期化しておきます。
  3. 各参加者について以下を行います:
    • 高橋君の点数 \(A_i\) と青木君の点数 \(B_i\) を入力から受け取ります。
    • 合計スコア \(A_i + B_i\) を計算します。
    • このスコアが現在の max_score より大きければ、max_scorewinner を更新します。
  4. 全部の参加者を処理した後、winner の値を出力します。

計算量

  • 時間計算量: \(O(N)\)
    (各参加者について定数時間の処理を行うだけなので、線形時間で解ける)
  • 空間計算量: \(O(1)\)
    (配列などを使わず、いくつかの変数のみを使用しているため)

実装のポイント

  • 入力は1-indexed(つまり参加者番号が1から始まる)なので、forループは range(1, N+1) で回す必要があります。

  • 最初に max_score を十分小さな値で初期化しておくこと(点数が全て正の値なので負の数にしておけば安全)。

  • 各参加者のスコアを読みながら逐次的に最大値を管理することで、メモリ使用量を抑えることができます。

    ソースコード

N = int(input())
max_score = -1
winner = -1

for i in range(1, N + 1):
    A, B = map(int, input().split())
    score = A + B
    if score > max_score:
        max_score = score
        winner = i

print(winner)

この解説は qwen3-coder-480b によって生成されました。

posted:
last update: