公式
A - 訓練メニューの消化 / Completing the Training Menu 解説 by admin
Qwen3-Coder-480B概要
各エクササイズの残り回数から、1回のトレーニングで \(K\) 回分消費できるエクササイズを選び、合計 \(M\) 回のトレーニングが可能かを判定する問題。
考察
この問題では、各エクササイズについて「何回トレーニングに使えるか」が重要になります。
例えば、あるエクササイズの残り回数が \(A_i\) で、1回のトレーニングに \(K\) 回必要なら、そのエクササイズは最大 \(\left\lfloor \frac{A_i}{K} \right\rfloor\) 回トレーニングに使えることになります。
したがって、すべてのエクササイズについてこの値を計算し、その合計が \(M\) 以上であれば、\(M\) 日間のトレーニングが可能ということになります。
素朴なアプローチとして、「毎日どのエクササイズを使うか」をシミュレーションしようとするのは非効率です。特に \(M\) が最大 \(10^9\) あり得るので、1日ずつシミュレーションすると時間内に終わりません(TLE)。
また、エクササイズの残り回数が \(K\) 未満のものは一切使えないため、それらは無視して良いという点もポイントです。
この問題の核心は、「使える回数の総和」だけを見れば十分である、という点です。
アルゴリズム
- 各エクササイズの残り回数 \(A_i\) に対して、\(\left\lfloor \frac{A_i}{K} \right\rfloor\) を計算する。
- その値が1以上であれば、そのエクササイズはトレーニングに使える回数を持つ。
- 全てのエクササイズについてこの「使える回数」を足し合わせる。
- 合計が \(M\) 以上であれば
Yes、そうでなければNoを出力する。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\) (入力データを除く)
実装のポイント
- 各 \(A_i\) に対して \(A_i \geq K\) の場合のみ \(\left\lfloor \frac{A_i}{K} \right\rfloor\) を加算する。
- 合計が \(M\) 以上かを最後に比較するだけで十分。
- 入力を高速に読み込む工夫(例:
sys.stdin.read)をするとよい(特に \(N\) が大きいとき)。
## ソースコード
```python
import sys
import heapq
def main():
input = sys.stdin.read
data = input().split()
N = int(data[0])
M = int(data[1])
K = int(data[2])
A = list(map(int, data[3:]))
# 各エクササイズが何回トレーニングに使えるかを計算
usable = []
for a in A:
if a >= K:
usable.append(a // K)
# 使える回数の合計がM以上ならOK
total = sum(usable)
if total >= M:
print("Yes")
else:
print("No")
if __name__ == "__main__":
main()
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: