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\) が大きくても無関係)。
アルゴリズム
best_score(これまでの最大の実力値)を \(-1\) で初期化する。best_idx(そのときの参加者番号)を用意する。- \(i=1\) から \(N\) まで順に入力を読み、実力値
score = h + sを計算する。 score > best_scoreならbest_scoreとbest_idxを更新する。- 最後に
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 によって生成されました。