Official

A - フリーランスの報酬 / Freelance Compensation Editorial by admin

Claude 4.6 Opus (Thinking)

概要

\(M\) 日以内に納品できる案件の報酬を合計し、そこからエージェント手数料(\(P\)%)を引いた金額を求める問題です。

考察

この問題で重要なポイントは以下の通りです:

  • 各案件について、納品までの日数 \(D_i\) が \(M\) 以下かどうかを判定する
  • 条件を満たす案件の報酬 \(V_i\) を合計する
  • 合計金額から手数料を引く(小数点以下切り捨て)

具体例で考えてみましょう:

例えば \(N=3\), \(M=10\), \(P=20\) で、以下の案件があるとします: - 案件1: \(D_1=5\), \(V_1=1000\)(10日以内 → 対象) - 案件2: \(D_2=15\), \(V_2=2000\)(10日超え → 対象外) - 案件3: \(D_3=8\), \(V_3=3000\)(10日以内 → 対象)

報酬合計 = \(1000 + 3000 = 4000\) 円

手数料 = \(4000 \times 20 / 100 = 800\) 円

手取り = \(4000 - 800 = 3200\) 円

手数料の計算について:

「報酬合計から手数料\(P\)%を引く」ということは、手取りは報酬合計の \((100 - P)\)% です。つまり:

\[\text{手取り} = \text{合計} \times \frac{100 - P}{100}\]

小数点以下切り捨てなので、整数除算(切り捨て除算)を使えばよいです。

この問題は素朴に全案件を1回ずつ見ればよいので、特別なアルゴリズムは不要です。ソートなども必要ありません。

アルゴリズム

  1. \(N\), \(M\), \(P\) を読み込む
  2. 変数 total を \(0\) で初期化する
  3. 各案件 \(i\) について:
    • \(D_i \leq M\) ならば、total に \(V_i\) を加算する
  4. 手取り金額を計算する:result = total * (100 - P) // 100
  5. result を出力する

ここで // は切り捨て除算(Python の整数除算演算子)です。

計算量

  • 時間計算量: \(O(N)\)(各案件を1回ずつ確認するだけ)
  • 空間計算量: \(O(1)\)(合計値を保持する変数のみ)

実装のポイント

  • 整数演算で切り捨てを実現する: total * (100 - P) // 100 とすることで、浮動小数点を使わずに正確に切り捨て除算ができます。浮動小数点(float)を使うと誤差が生じる可能性があるため、整数のまま計算するのが安全です。

  • \(P = 0\) や \(P = 100\) の場合: \(P=0\) なら手数料なし(全額もらえる)、\(P=100\) なら手取り \(0\) 円となりますが、式 total * (100 - P) // 100 で自然に対応できます。

  • オーバーフローの心配: Python は多倍長整数を標準でサポートしているため、\(V_i\) の合計が大きくなっても問題ありません(最大で \(2 \times 10^5 \times 10^6 = 2 \times 10^{11}\) 程度)。

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    N, M, P = map(int, input().split())
    total = 0
    for _ in range(N):
        d, v = map(int, input().split())
        if d <= M:
            total += v
    result = total * (100 - P) // 100
    print(result)

main()

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

posted:
last update: