公式
A - イベント払い戻し / Event Refund 解説 by admin
DeepSeek V3概要
この問題は、各来場者のチケット種類と購入金額に基づいて、一般チケットは全額、学割チケットは半額(端数切り捨て)を払い戻す合計金額を計算する問題です。
考察
問題の要件はシンプルで、各来場者について以下の計算を行うだけです:
- チケット種類が normal なら \(P_i\) をそのまま加算
- チケット種類が half なら \(P_i / 2\) の整数部分(端数切り捨て)を加算
入力サイズが最大 \(2 \times 10^5\) と大きいため、効率的な処理が必要ですが、各レコードに対する処理が単純な算術演算と条件分岐のみであるため、線形時間で処理できます。
アルゴリズム
- 標準入力からデータを読み込む
- 最初の行から人数 \(N\) を取得
- 各行を順に処理:
- スペースで分割してチケット種類 \(T_i\) と購入金額 \(P_i\) を取得
- \(T_i\) が “normal” なら \(P_i\) を合計に加算
- \(T_i\) が “half” なら \(P_i // 2\)(整数除算)を合計に加算
- 最終的な合計金額を出力
計算量
- 時間計算量: \(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 によって生成されました。