公式

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\) 未満のものは一切使えないため、それらは無視して良いという点もポイントです。

この問題の核心は、「使える回数の総和」だけを見れば十分である、という点です。

アルゴリズム

  1. 各エクササイズの残り回数 \(A_i\) に対して、\(\left\lfloor \frac{A_i}{K} \right\rfloor\) を計算する。
  2. その値が1以上であれば、そのエクササイズはトレーニングに使える回数を持つ。
  3. 全てのエクササイズについてこの「使える回数」を足し合わせる。
  4. 合計が \(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 によって生成されました。

投稿日時:
最終更新: