公式
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。
アルゴリズム
- 変数
best_sum(これまでの最大合計点)とbest_idx(その参加者番号)を用意する。 - \(i=1\) から \(N\) まで順に \((A_i, B_i)\) を読み込み、\(s = A_i + B_i\) を計算する。
- もし \(s > best_sum\) なら、
best_sum = s、best_idx = iに更新する。 - 全員見終わったら
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 によって生成されました。
投稿日時:
最終更新: