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回ずつ見ればよいので、特別なアルゴリズムは不要です。ソートなども必要ありません。
アルゴリズム
- \(N\), \(M\), \(P\) を読み込む
- 変数
totalを \(0\) で初期化する - 各案件 \(i\) について:
- \(D_i \leq M\) ならば、
totalに \(V_i\) を加算する
- \(D_i \leq M\) ならば、
- 手取り金額を計算する:
result = total * (100 - P) // 100 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: