Official

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

GPT 5.2 High

概要

各参加者の「実力値」\(H_i + S_i\) を計算し、その値が最大となる参加者の番号を求める問題です(\(D_i\) は無視します)。

考察

  • 総合得点は \(H_i + S_i + D_i\) ですが、青木君が見たいのはボーナスを除いた純粋な実力なので、比較すべきは 実力値 \(H_i + S_i\) です。
    \(D_i\) は入力されますが、この問題の勝者判定には関係しません。
  • やるべきことは「\(H_i + S_i\) が最大の人を探す」だけなので、全員を一度ずつ見て最大値を更新すれば十分です。
  • 素朴に「全員の実力値を配列に入れて最後に最大を探す」でも正解ですが、配列に保存する必要すらなく、読みながら最大を更新すればメモリも節約できます(\(N \le 2\times 10^5\) なのでどちらでも間に合いますが、より簡潔で安全です)。
  • 最大の参加者はちょうど一人と保証されているため、同点処理(複数人で最大など)を考える必要はありません。

例:
参加者が3人で
1: \((H,S,D)=(10,20,100)\) → 実力値 \(30\)
2: \((5,40,0)\) → 実力値 \(45\)
3: \((30,10,1000)\) → 実力値 \(40\)
最大は \(45\) の2番なので答えは 2 です(\(D\) が大きくても無関係)。

アルゴリズム

  1. best_score(これまでの最大の実力値)を \(-1\) で初期化する。
  2. best_idx(そのときの参加者番号)を用意する。
  3. \(i=1\) から \(N\) まで順に入力を読み、実力値 score = h + s を計算する。
  4. score > best_score なら best_score と best_idx を更新する。
  5. 最後に best_idx を出力する。

計算量

  • 時間計算量: \(O(N)\)(全員を1回ずつ見るだけ)
  • 空間計算量: \(O(1)\)(最大値と番号だけ保持)

実装のポイント

  • 参加者番号は問題文どおり 1始まり なので、ループを for i in range(1, N + 1): とします。

  • 入力が最大 \(2\times 10^5\) 行あるため、Python では sys.stdin.readline を使うと安定して高速です。

  • \(H_i, S_i\) は最大 \(10^9\) ですが、和は最大 \(2\times 10^9\) で Python の int なら安全に扱えます。

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    N = int(input())
    best_score = -1
    best_idx = -1
    for i in range(1, N + 1):
        h, s, d = map(int, input().split())
        score = h + s
        if score > best_score:
            best_score = score
            best_idx = i
    print(best_idx)

if __name__ == "__main__":
    main()

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