公式

A - イベント払い戻し / Event Refund 解説 by admin

DeepSeek V3

概要

この問題は、各来場者のチケット種類と購入金額に基づいて、一般チケットは全額、学割チケットは半額(端数切り捨て)を払い戻す合計金額を計算する問題です。

考察

問題の要件はシンプルで、各来場者について以下の計算を行うだけです: - チケット種類が normal なら \(P_i\) をそのまま加算 - チケット種類が half なら \(P_i / 2\) の整数部分(端数切り捨て)を加算

入力サイズが最大 \(2 \times 10^5\) と大きいため、効率的な処理が必要ですが、各レコードに対する処理が単純な算術演算と条件分岐のみであるため、線形時間で処理できます。

アルゴリズム

  1. 標準入力からデータを読み込む
  2. 最初の行から人数 \(N\) を取得
  3. 各行を順に処理:
    • スペースで分割してチケット種類 \(T_i\) と購入金額 \(P_i\) を取得
    • \(T_i\) が “normal” なら \(P_i\) を合計に加算
    • \(T_i\) が “half” なら \(P_i // 2\)(整数除算)を合計に加算
  4. 最終的な合計金額を出力

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(N)\)(入力データを一度に読み込む場合)

実装のポイント

  • 整数除算(//)を使用することで、半額計算時の端数切り捨てを自然に実装できます

  • 入力データの読み込みには sys.stdin.read().splitlines() を使用し、効率的な処理を心がけました

  • チケット種類のチェックは文字列比較ですが、入力サイズが大きいため、単純な条件分岐で十分効率的です

    ソースコード

import sys

def main():
    data = sys.stdin.read().splitlines()
    n = int(data[0])
    total = 0
    for i in range(1, n + 1):
        t, p = data[i].split()
        p = int(p)
        if t == "normal":
            total += p
        else:  # t == "half"
            total += p // 2
    print(total)

if __name__ == "__main__":
    main()

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