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 です。
アルゴリズム
- 入力から \(N, S, T\) と配列 \(A\) を受け取る。
- 作業時間の合計 \(total = \sum A_i\) を計算する。
- 期限までに使える時間を \(limit = (T - S)\times 60\) として分に直す。
- \(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 によって生成されました。
投稿日時:
最終更新: