公式

A - 荷物の配送 / Package Delivery 解説 by admin

gpt-5.3-codex

概要

各ドライバーは最大 \(K\) 個まで運べるので、\(N\) 人全体で運べる荷物の上限は \(N \times K\) 個です。
したがって、全届け先の荷物総数 \(\sum A_i\) がこの上限以下かどうかを判定すればよい問題です。

考察

この問題のポイントは、届け先ごとの制約が実質ないことです。
なぜなら、

  • 同じ届け先の荷物を複数ドライバーで分担してよい
  • 荷物は 1 個単位で割り当てできる
  • 各ドライバーの制約は「合計 \(K\) 個以下」だけ

だからです。
つまり「どの届け先に何個運ぶか」を細かく考える必要はなく、全体で何個運べるかだけ見れば十分です。


一見すると、
「各届け先を順番にドライバーへ詰めていくシミュレーション」
のような方法を考えがちですが、これは不要です。
制約 \(M \le 10^5\) なのでシミュレーションでも間に合う可能性はありますが、実装が複雑になり、バグの原因にもなります。

この問題はもっと単純で、

  • 必要な荷物数:\(S = \sum_{i=1}^{M} A_i\)
  • 運べる最大荷物数:\(C = N \times K\)

として、\(S \le C\) なら Yes、そうでなければ No です。

例: - \(N=3, K=4\) なら最大 \(12\) 個運べる - 荷物総数が \(10\) 個なら可能(Yes) - 荷物総数が \(13\) 個なら不可能(No

アルゴリズム

  1. \(N, M, K\) を読む。
  2. \(M\) 個の \(A_i\) をすべて足して total を作る。
  3. total <= N * K なら Yes、それ以外は No を出力する。

計算量

  • 時間計算量: \(O(M)\)
  • 空間計算量: \(O(1)\)(入力を逐次加算しており、配列保持が不要)

実装のポイント

  • 合計値や \(N \times K\) は大きくなり得るので、言語によってはオーバーフローに注意します(Python は多倍長整数なので安全)。

  • A_i を配列に保存せず、その場で total に加算するとメモリ効率がよいです。

  • 入力が多めなので sys.stdin.readline を使う実装は適切です。

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    N, M, K = map(int, input().split())
    total = 0
    for _ in range(M):
        total += int(input())
    print("Yes" if total <= N * K else "No")

if __name__ == "__main__":
    main()

この解説は gpt-5.3-codex によって生成されました。

投稿日時:
最終更新: