公式

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

Gemini 3.1 Pro (Thinking)

概要

\(N\) 人のスタッフそれぞれのシフト回数に応じて、条件を満たす場合は特別手当を加算した給料を計算し、全員分の合計額を求める問題です。

考察

この問題は、問題文に書かれている給料の計算ルールをそのままプログラムに落とし込むことで正解できます。 制約を見るとスタッフの人数 \(N\) は最大でも \(100\) 人と非常に小さいため、一人ずつ給料を計算して足し合わせる素朴なアプローチで十分に間に合います(実行時間制限に引っかかることはありません)。

各スタッフのシフト回数を \(C_i\) としたとき、支払われる給料は以下のようになります。 - \(C_i \ge K\) の場合:特別手当がつくため、シフト1回あたり \(P + B\) 円。そのスタッフへの支払額は \(C_i \times (P + B)\) 円。 - \(C_i < K\) の場合:基本給のみのため、シフト1回あたり \(P\) 円。そのスタッフへの支払額は \(C_i \times P\) 円。

これを全員分計算して合計すればよいです。給料の合計額は最大でも \(100 \times 31 \times (1000 + 1000) = 6,200,000\) 円程度なので、C++ などの言語でも標準的な 32bit 整数型(int)に収まり、オーバーフローの心配もありません。

アルゴリズム

  1. 答えを格納する変数 total\(0\) で初期化します。
  2. 各スタッフのシフト回数 \(C_i\) について順番に以下の処理を行います。
    • もし \(C_i \ge K\) なら、total\(C_i \times (P + B)\) を足します。
    • そうでなければ、total\(C_i \times P\) を足します。
  3. 最後に total を出力します。

計算量

  • 時間計算量: \(O(N)\)
    • \(N\) 人のスタッフに対して、それぞれ1回の条件分岐と掛け算を行うため、処理時間は \(N\) に比例します。
  • 空間計算量: \(O(N)\)
    • 入力された \(N\) 人分のシフト回数を配列(リスト)として保持するために使用します。

実装のポイント

Pythonでは sum() 関数とジェネレータ式を組み合わせることで、ループと条件分岐を簡潔に書くことができます。 提供された正解コードの c * (P + B) if c >= K else c * P は、「もし \(c \ge K\) なら \(c \times (P + B)\) 、そうでないなら \(c \times P\)」という処理を1行で表現したものです。

もちろん、標準的な for ループと if 文を使って以下のように書いても全く問題なく、より直感的に理解しやすくなります。

total = 0
for c in C:
    if c >= K:
        total += c * (P + B)
    else:
        total += c * P

ソースコード

N, P, B, K = map(int, input().split())
C = list(map(int, input().split()))

total = sum(c * (P + B) if c >= K else c * P for c in C)
print(total)

この解説は gemini-3.1-pro-thinking によって生成されました。

投稿日時:
最終更新: