公式

A - アルバイトの給料計算 / Calculating Part-Time Job Pay 解説 by admin

GPT 5.2 High

概要

各スタッフのシフト回数 \(C_i\) に応じて「1回あたりの単価」が変わるので、全員分の給与をそのまま合計して求める問題です。

考察

重要なのは、特別手当 \(B\) が「条件を満たしたスタッフの“全シフト”に上乗せされる」という点です。
つまり、スタッフ \(i\) について

  • \(C_i \ge K\) なら 1回あたり \(P+B\)
  • \(C_i < K\) なら 1回あたり \(P\)

となり、給与はそれぞれ

  • \(C_i(P+B)\) または \(C_iP\)

で一発で計算できます。

やりがちな誤り(WAの原因)として、例えば「\(K\) 回目以降のシフトだけに \(B\) を付ける」と勘違いして \( (C_i-K)B \) のように計算してしまうケースがあります。しかし本問は「\(K\) 回以上なら全シフトが対象」なので、条件を満たすなら \(C_iB\) を丸ごと加算します。

具体例:\(P=1000, B=200, K=5, C_i=6\) のとき
- 正しい:\(6 \times (1000+200)=7200\)
- 誤り例:\((6 \times 1000) + (6-5)\times 200=6200\)(条件の解釈違い)

アルゴリズム

  1. 入力として \(N, P, B, K\) と各 \(C_i\) を受け取る。
  2. 合計 total\(0\) で初期化する。
  3. 各スタッフについて以下を加算する:
    • まず基本給として \(C_i \times P\) を加算
    • さらに \(C_i \ge K\) なら特別手当として \(C_i \times B\) を加算
  4. total を出力する。

(コードでは「常に \(C_iP\) を足し、条件を満たすときだけ \(C_iB\) を追加」という形にしており、分岐がシンプルになります。)

計算量

  • 時間計算量: \(O(N)\)(各スタッフを1回ずつ処理するだけ)
  • 空間計算量: \(O(1)\)(合計を持つだけ。入力配列を除けば定数)

実装のポイント

  • 条件は「\(C_i \ge K\)」であることに注意(等号を忘れない)。

  • 特別手当は「全シフトに対して」なので、加算は \(C_i \times B\)

  • 合計金額は最大でも \(100 \times 31 \times (1000+1000)=6{,}200{,}000\) 程度なので、Python の int で問題ありません。

    ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.read().split()))
    N, P, B, K = data[0], data[1], data[2], data[3]
    C = data[4:4+N]
    total = 0
    for ci in C:
        total += ci * P
        if ci >= K:
            total += ci * B
    print(total)

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

投稿日時:
最終更新: