Official
A - 図書館の貸出管理 / Library Loan Management Editorial by admin Editorial for printing
Qwen3-Coder-480B概要
図書館にある複数種類の本について、貸出申請に従って在庫を更新し、最終的な在庫数を求める問題。
考察
この問題では、各貸出申請が順番に与えられ、指定された本の在庫が申請冊数以上ある場合にのみ貸し出しを行い、在庫を減らす必要があります。
素朴なアプローチとして、毎回の申請で在庫数を直接確認・更新する方法がありますが、これは特に問題ありません。というのも、制約を見ると、本の種類数 \(N\) や貸出申請数 \(M\) は最大で \(10^5\) であり、各申請に対して在庫の確認と更新は定数時間で行えるので、全体でも十分間に合うからです。
逆に、もし各申請ごとに複雑な処理が必要だったり、何度も同じ本を参照する必要があったりすれば、より効率的なデータ構造(例えば累積和やセグメント木など)を検討する必要がありますが、今回は不要です。
この問題で注意すべき点は、申請冊数が現在の在庫数を超えている場合は貸し出しを行わず、在庫も変化させないことです。つまり、単純に引き算してマイナスになってもよいわけではないところが重要です。
アルゴリズム
- 最初に、各本の初期在庫数をリスト
booksに格納します。 - 各貸出申請を順番に読み込みながら以下を繰り返します:
- 管理番号 \(b\) に対応する在庫数が、申請冊数 \(c\) 以上であれば、在庫から \(c\) を引きます。
- すべての申請処理が終わったら、最終的な在庫数を順に出力します。
このとき、管理番号は1-indexed(1から始まる)なので、配列のインデックスとしては0-indexed(0から始まる)に変換する必要があります(つまり、管理番号 \(b\) は配列のインデックス \(b - 1\) に対応します)。
計算量
- 時間計算量: \(O(N + M)\)
(初期在庫の読み込みに \(O(N)\)、各申請の処理に \(O(1) \times M\)) - 空間計算量: \(O(N)\)
(在庫情報を保持するリスト)
実装のポイント
- 管理番号が1-indexedなので、リストの添字にアクセスする際は
-1するのを忘れない。 - 在庫が足りない場合は何もしない(更新しない)ように条件分岐を行う。
- 出力時は
print(*books)のようにして、スペース区切りで一行に出力する。
## ソースコード
```python
# 図書館の貸出管理
# 入力読み込み
N, M = map(int, input().split())
A = list(map(int, input().split()))
# 蔵書数を管理するリスト(0-indexedで扱うため、そのまま使用)
books = A[:]
# 各貸出申請を順番に処理
for _ in range(M):
b, c = map(int, input().split())
index = b - 1 # 0-indexedに変換
if books[index] >= c:
books[index] -= c
# 結果を出力
print(*books)
この解説は qwen3-coder-480b によって生成されました。
posted:
last update: