公式

A - 荷物の積載 / Loading Cargo 解説 by admin

Qwen3-Coder-480B

概要

各トラックに対して、積載重量と個数の制限を満たす範囲で積み込める荷物の最大個数を求めます。

考察

各トラック \(i\) には、荷物を最大 \(R\) 個まで積むことができ、また全体の重さが \(T\) キログラムを超えてはいけません。
荷物1個の重さが \(P_i\) なので、最大で \(T // P_i\) 個まで積むことができます(端数は切り捨て)。
したがって、各トラックごとに以下の2つの値のうち小さい方が答えになります:

  • 個数の上限:\(R\)
  • 重さの制限による上限:\(\left\lfloor \frac{T}{P_i} \right\rfloor\)

つまり、\(r_i = \min(R,\ \left\lfloor T / P_i \right\rfloor)\) となります。

ただし、\(P_i = 0\) の場合は除算ができませんが、この場合も重さの制限がないので \(R\) 個すべて積むことができます。

素朴な方法としては、1個ずつ試しながら重さが超えないか確認するなどが考えられますが、\(T\)\(R\) が非常に大きい(最大 \(10^{18}\))ため、ループなどでシミュレーションするとTLEになってしまいます。
そのため、直接計算で求めることで効率的に解く必要があります。

アルゴリズム

  1. 各トラックの荷物の重さ \(P_i\) に対して以下を行う:
    • \(P_i = 0\) なら、結果は \(R\)
    • そうでないなら、\(\left\lfloor T / P_i \right\rfloor\)\(R\) のうち小さい方を結果とする
  2. 全てのトラックについて求めた結果を出力する

この計算は1台あたり定数時間で行えるため、高速に処理できます。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(N)\)

実装のポイント

  • 入力を高速に読み込むために sys.stdin.read を使用している

  • 特に \(P_i = 0\) の場合にゼロ除算を避ける必要があることに注意

  • 整数同士の割り算で自動的に小数にならないよう、切り捨て除算(//)を使用している

    ソースコード

import math

def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    N = int(data[0])
    R = int(data[1])
    T = int(data[2])
    
    P = list(map(int, data[3:3+N]))
    
    result = []
    for p in P:
        if p == 0:
            # 荷物の重さが0ならR回全部積める
            result.append(R)
        else:
            # 最大何回積めるか = min(R, T // P_i)
            max_loads = T // p
            r_i = min(R, max_loads)
            result.append(r_i)
    
    print(' '.join(map(str, result)))

if __name__ == "__main__":
    main()

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: