公式

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

Claude 4.6 Opus (Thinking)

概要

各アルバイトスタッフのシフト回数に応じて、基本給のみか基本給+特別手当かを判定し、全員の給料の合計額を求める問題です。

考察

この問題では、スタッフごとに以下の2パターンのどちらかで給料が決まります。

  • シフト回数 \(C_i\)\(K\)以上\(1\) 回あたり \((P + B)\)
  • シフト回数 \(C_i\)\(K\)未満\(1\) 回あたり \(P\)

つまり、各スタッフについて「シフト回数が閾値 \(K\) 以上かどうか」を判定し、該当する単価にシフト回数を掛ければ、そのスタッフへの支払額が求まります。

具体例で確認してみましょう。

例えば \(N = 3\), \(P = 100\), \(B = 50\), \(K = 5\) で、シフト回数が \(C = [3, 5, 8]\) の場合:

スタッフ シフト回数 \(K\) 以上? 単価 支払額
1 3 No \(100\) \(3 \times 100 = 300\)
2 5 Yes \(150\) \(5 \times 150 = 750\)
3 8 Yes \(150\) \(8 \times 150 = 1200\)

合計: \(300 + 750 + 1200 = 2250\)

この問題は制約が小さく(\(N \leq 100\))、単純にループで全スタッフを処理すれば十分です。特別な工夫やアルゴリズムは不要で、素朴なアプローチで問題なく解けます。

アルゴリズム

  1. \(N\), \(P\), \(B\), \(K\) および各スタッフのシフト回数 \(C_1, C_2, \ldots, C_N\) を入力から読み取る。
  2. 合計額 total\(0\) で初期化する。
  3. 各スタッフ \(i\) について:
    • \(C_i \geq K\) なら、total\(C_i \times (P + B)\) を加算する。
    • \(C_i < K\) なら、total\(C_i \times P\) を加算する。
  4. total を出力する。

計算量

  • 時間計算量: \(O(N)\) — 各スタッフについて1回ずつ判定と計算を行うだけです。
  • 空間計算量: \(O(N)\) — シフト回数のリストを保持する分です(逐次読み込めば \(O(1)\) も可能)。

実装のポイント

  • 条件判定は「\(K\)以上」であることに注意してください。>= を使います(> ではありません)。

  • 特別手当は「基本給に上乗せ」されるので、\(K\) 回以上のスタッフの単価は \(P + B\) です。特別手当 \(B\) のみではなく、基本給 \(P\) も含まれる点を見落とさないようにしましょう。

    ソースコード

N, P, B, K = map(int, input().split())
C = list(map(int, input().split()))
total = 0
for c in C:
    if c >= K:
        total += c * (P + B)
    else:
        total += c * P
print(total)

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

投稿日時:
最終更新: