A - フリーランスの報酬 / Freelance Compensation 解説 by admin
gpt-5.5-high概要
\(N\) 件の案件のうち、納品までの日数 \(D_i\) が \(M\) 日以内である案件だけを対象に、報酬 \(V_i\) の合計を求めます。
その合計から手数料 \(P\) パーセントを差し引いた金額を、小数点以下切り捨てで出力します。
考察
案件 \(i\) が今後 \(M\) 日以内に納品完了するかどうかは、単純に
\(D_i \leq M\)
を満たすかどうかで判定できます。
したがって、すべての案件を 1 件ずつ確認し、条件を満たす案件の報酬だけを合計すればよいです。
例えば、\(M = 10\) のとき、
| 案件 | \(D_i\) | \(V_i\) | 対象か |
|---|---|---|---|
| 1 | 5 | 1000 | 対象 |
| 2 | 12 | 3000 | 対象外 |
| 3 | 10 | 2000 | 対象 |
この場合、報酬合計は
\(1000 + 2000 = 3000\)
です。
ここから手数料 \(P\) パーセントを差し引くので、最終的に受け取る金額は
\(3000 \times \frac{100 - P}{100}\)
となります。
答えは小数点以下を切り捨てる必要があります。
そのため、整数除算を使って
\(total \times (100 - P) // 100\)
と計算すればよいです。
素朴に「1 日目から \(M\) 日目までをシミュレーションする」ような方法を考えると、\(M\) は最大で \(10^9\) と非常に大きいため、実行時間が間に合いません。
しかし、この問題では各案件について \(D_i \leq M\) かを見るだけで十分なので、日ごとのシミュレーションは不要です。
アルゴリズム
- \(N, M, P\) を入力する。
- 報酬合計を表す変数
totalを \(0\) で初期化する。 - 各案件について、\(D_i, V_i\) を入力する。
- もし \(D_i \leq M\) なら、その案件は \(M\) 日以内に納品完了するので、
totalに \(V_i\) を加える。 - 最後に、手数料を差し引いた金額
\(total \times \frac{100 - P}{100}\)
を小数点以下切り捨てで出力する。
整数演算では次のように書けます。
\(total \times (100 - P) // 100\)
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)
実装のポイント
\(D_i \leq M\) の案件だけを合計します。
手数料を引いた後の金額は、小数点以下を切り捨てる必要があるため、
//による整数除算を使います。報酬の合計は最大で \(2 \times 10^5 \times 10^6 = 2 \times 10^{11}\) になるため、他の言語では 64 bit 整数型を使う必要があります。Python では整数の桁あふれを気にする必要はありません。
ソースコード
import sys
def main():
input = sys.stdin.buffer.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
print(total * (100 - P) // 100)
if __name__ == "__main__":
main()
この解説は gpt-5.5-high によって生成されました。
投稿日時:
最終更新: