Official

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

Qwen3-Coder-480B

概要

各参加者の「味の得点」と「盛り付けの得点」の和(実力値)が最も高い人の番号を求めます。ボーナス得点は実力値には関係しません。

考察

この問題では、各参加者の実力値 \(H_i + S_i\) を求め、その最大値を持つ参加者の番号を答える必要があります。
ボーナス得点 \(D_i\) は実力値に影響しないため、計算からは無視して構いません。

素朴な方法として、すべての参加者の実力値を配列に保存してから最大値を探索することも考えられますが、
参加者数 \(N\) は最大で \(2 \times 10^5\) あるため、特にメモリ使用量の観点で不利になることはありませんが、
入力を一度全部読み込んでから処理するよりも、逐次処理した方がシンプルかつ高速です。

この問題では、入力を受け取りながらその場で実力値を計算し、最大値を更新するかどうか判定すれば十分です。
これにより、不要な配列や変数を用意する必要がなくなり、空間計算量も削減できます。

アルゴリズム

  1. 参加者数 \(N\) を受け取る。
  2. 最大実力値 max_score を非常に小さな値(または最初の値)で初期化し、
    優勝者の番号 winner も適当に初期化しておく。
  3. 各参加者について以下の処理を行う:
    • 入力から \(H_i\), \(S_i\), \(D_i\) を受け取る。
    • 実力値を \(H_i + S_i\) として計算する。
    • この実力値が現在の最大値より大きければ、最大値と優勝者番号を更新する。
  4. 最後に優勝者の番号を出力する。

計算量

  • 時間計算量: \(O(N)\)
    → 各参加者に対して定数時間の操作を行っているため。
  • 空間計算量: \(O(1)\)
    → 入力サイズに依存せず、一定の変数のみを使用している。

実装のポイント

  • 実力値の比較は入力を受け取るたびに行い、最大値とそのインデックスを記録しておく。

  • 番号は1-indexed(1から始まる)なので、ループ変数 i が0から始まる場合は i + 1 を出力することに注意。

  • 最初の max_score の初期値は -1 など、あり得ない小さな値にしておくと安全。

    ソースコード

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

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

print(winner)

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

posted:
last update: