公式

A - 出発までの準備 / Preparations Before Departure 解説 by admin

GPT 5.2 High

概要

開始時刻 \(S\)\(0\) 分から合計 \(N\) 個の作業を休憩なしで行ったとき、締切の \(T\)\(0\) 分までに終わるかを、作業時間の合計だけで判定する問題です。

考察

重要な気づきは「作業の順番を変えても、全部終わる時刻は変わらない」という点です。
なぜなら、休憩なしで連続して行うので、終了までにかかる総時間は常に \(\sum_{i=1}^{N} A_i\) 分で一定だからです。

素朴に「どの順番なら間に合うか」を考えて全探索(順列を試す)すると、最大で \(N!=100!\) のように天文学的な通り数になり、当然実行できません(TLE)。しかしこの問題では順番による差がそもそも存在しないため、全探索自体が不要です。

したがって、 - 準備に使える時間(分) = \((T - S)\times 60\) - 作業の合計時間(分) = \(\sum A_i\)

を比較して、合計が以内なら Yes、超えるなら No でよいです。

例:\(S=9, T=10\) なら使える時間は \(60\) 分。作業時間の合計が \(55\) 分なら間に合うので Yes\(61\) 分なら No です。

アルゴリズム

  1. 入力から \(N, S, T\) と配列 \(A\) を受け取る。
  2. 作業時間の合計 \(total = \sum A_i\) を計算する。
  3. 期限までに使える時間を \(limit = (T - S)\times 60\) として分に直す。
  4. \(total \le limit\) なら Yes、そうでなければ No を出力する。

計算量

  • 時間計算量: \(O(N)\)(合計を取るだけ)
  • 空間計算量: \(O(N)\)(配列 \(A\) を保持する分。合計だけなら \(O(1)\) にも可能)

実装のポイント

  • 時刻は「時」単位で与えられるので、比較しやすいように分へ変換してから判定します(\((T-S)\times 60\))。

  • 条件は「\(T\) 時ちょうど“まで”」なので、比較は < ではなく <= を使います。

    ソースコード

import sys

def main():
    data = sys.stdin.read().strip().split()
    if not data:
        return
    N, S, T = map(int, data[:3])
    A = list(map(int, data[3:3+N]))
    total = sum(A)
    limit = (T - S) * 60
    print("Yes" if total <= limit else "No")

if __name__ == "__main__":
    main()

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

投稿日時:
最終更新: