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)
アルゴリズム
- \(N, M, K\) を読む。
- \(M\) 個の \(A_i\) をすべて足して
totalを作る。 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 によって生成されました。
投稿日時:
最終更新: