公式

A - イベント払い戻し / Event Refund 解説 by admin 印刷ページ

Claude 4.6 Opus (Thinking)

概要

\(N\) 人の来場者それぞれについて、チケットの種類に応じた払い戻し金額を計算し、その合計を求める問題です。一般チケット(normal)なら全額、学割チケット(half)なら半額(端数切り捨て)を払い戻します。

考察

この問題は非常にシンプルで、各来場者ごとに条件分岐をして払い戻し金額を足し合わせるだけです。

  • 重要な気づき: チケットの種類は normal と half の 2 種類しかないため、単純な if-else で処理できます。
  • 端数切り捨て: 学割チケットの場合、購入金額の半額を「端数切り捨て」で計算する必要があります。例えば、購入金額が \(P = 1001\) 円なら、払い戻し額は \(\lfloor 1001 / 2 \rfloor = 500\) 円です。Python では整数の切り捨て除算 // 演算子を使えばこれを実現できます。
  • この問題では特別な工夫は不要で、素朴に \(N\) 人分をループで処理すれば十分間に合います。\(N \leq 2 \times 10^5\) なので、\(O(N)\) の処理は余裕です。

具体例

例えば、以下の入力を考えます:

3
normal 1000
half 1500
half 1001
来場者 チケット種類 購入金額 払い戻し額
1 normal 1000 \(1000\)(全額)
2 half 1500 \(\lfloor 1500 / 2 \rfloor = 750\)
3 half 1001 \(\lfloor 1001 / 2 \rfloor = 500\)

合計払い戻し額は \(1000 + 750 + 500 = 2250\) となります。

アルゴリズム

  1. 来場者の人数 \(N\) を読み込む。
  2. 合計金額を管理する変数 total を \(0\) で初期化する。
  3. \(N\) 人分のデータを 1 人ずつ読み込み、以下の処理を行う:
    • チケットの種類が normal なら、購入金額 \(P_i\) をそのまま total に加算する。
    • チケットの種類が half なら、\(\lfloor P_i / 2 \rfloor\) を total に加算する。
  4. 最終的な total を出力する。

計算量

  • 時間計算量: \(O(N)\) — 各来場者について定数時間の処理を行うため。
  • 空間計算量: \(O(1)\) — 合計金額を保持する変数のみ使用し、全データを保存する必要はない。

実装のポイント

  • 切り捨て除算: Python では // 演算子が整数の切り捨て除算を行います。\(P_i\) が正の整数であれば、p // 2 で正しく端数切り捨ての半額が得られます。

  • 入力の分割: 各行はチケット種類(文字列)と購入金額(整数)がスペース区切りで与えられるため、input().split() で分割した後、金額部分だけ int() で整数に変換します。

  • 条件分岐: チケット種類は normal か half の 2 択なので、if t == "normal" で判定し、それ以外は half として処理すれば十分です。

    ソースコード

N = int(input())
total = 0
for _ in range(N):
    t, p = input().split()
    p = int(p)
    if t == "normal":
        total += p
    else:
        total += p // 2
print(total)

この解説は claude4.6opus-thinking によって生成されました。

投稿日時:
最終更新: