公式

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\) かを見るだけで十分なので、日ごとのシミュレーションは不要です。

アルゴリズム

  1. \(N, M, P\) を入力する。
  2. 報酬合計を表す変数 total を \(0\) で初期化する。
  3. 各案件について、\(D_i, V_i\) を入力する。
  4. もし \(D_i \leq M\) なら、その案件は \(M\) 日以内に納品完了するので、total に \(V_i\) を加える。
  5. 最後に、手数料を差し引いた金額

\(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 によって生成されました。

投稿日時:
最終更新: