Official

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

DeepSeek V3

概要

各参加者の高橋君と青木君からの点数を合計した最終スコアが最も高い参加者の番号を求める問題です。最終スコアが最も高い参加者はちょうど1人であることが保証されています。

考察

この問題は、各参加者の2人の審査員からの点数を合計した値(最終スコア)を計算し、その最大値を持つ参加者を見つけるというシンプルな問題です。重要な点は、最終スコアが最大の参加者が複数存在しないことが保証されているため、最大値が1つだけ存在するという点です。

素朴なアプローチとして、すべての参加者について順番に合計点を計算し、これまでの最大値よりも大きい値が見つかったら最大値と優勝者を更新する方法が考えられます。この方法は問題の制約(N ≤ 200,000)でも十分に高速に動作します。

アルゴリズム

  1. 参加者数Nを読み込む
  2. 最大スコアを-1(初期値)、優勝者番号を-1(初期値)に設定
  3. 各参加者(i=1からNまで)について:
    • 高橋君の点数A_iと青木君の点数B_iを読み込む
    • 合計スコア total = A_i + B_i を計算
    • totalが現在の最大スコアより大きければ、最大スコアをtotalに、優勝者番号をiに更新
  4. 最終的に得られた優勝者番号を出力

計算量

  • 時間計算量: \(O(N)\)
    • 参加者数Nに対して1回のループを行うため
  • 空間計算量: \(O(N)\)
    • 入力データを保存するためのメモリ使用量

実装のポイント

  • 最大スコアの初期値は-1に設定することで、すべての参加者の合計点(最低値は2)よりも小さく保っています

  • 参加者番号は1から始まるため、ループのインデックスをそのまま優勝者番号として使用できます

  • 入力データを一度に読み込むことで、効率的な処理を実現しています

    ソースコード

import sys

def main():
    data = sys.stdin.read().splitlines()
    n = int(data[0])
    max_score = -1
    winner = -1
    for i in range(1, n + 1):
        a, b = map(int, data[i].split())
        total = a + b
        if total > max_score:
            max_score = total
            winner = i
    print(winner)

if __name__ == "__main__":
    main()

この解説は deepseekv3 によって生成されました。

posted:
last update: