A - 料理人の休憩 / Chef's Break Editorial by admin
GPT 5.2 High概要
食材の下ごしらえ時間の合計に、必ず取ることになる休憩時間 \(M \times R\) を足したものが、そのまま最小(というより常に同じ)合計時間になります。
考察
この問題のポイントは「順番を変えても、合計時間が変わらない」ことです。
- 食材の下ごしらえは必ず全て行うので、下ごしらえにかかる総時間は順番に関係なく常に \(\sum_{i=1}^{N} T_i\) です。
- 休憩は「ちょうど \(M\) 回」「1回 \(R\) 秒」なので、休憩にかかる総時間も常に \(M \times R\) です。
- 休憩は「食材を終えた直後」にしか取れず、「最初の前」「最後の後」には取れませんが、制約で \(M \le N-1\) が保証されています。
つまり、食材と食材の間(間は全部で \(N-1\) 箇所)に休憩を入れれば必ず \(M\) 回入れられます。
よって、どの食材を先にやるか・どこで休憩を挟むかを工夫して短くする余地がありません。最小値は常に [ \sum_{i=1}^{N} T_i + M R ] です。
具体例:
\(N=3, M=1, R=10, (T_1,T_2,T_3)=(3,100,5)\) のとき、
どんな順番でも下ごしらえ合計は \(3+100+5=108\)、休憩は1回で \(10\)。
合計は常に \(118\) 秒になります(休憩を入れる場所を変えても同じ)。
素朴に「順番を全探索」「休憩位置をDP」などを考えると、\(N\) が最大 \(2 \times 10^5\) なので到底間に合いません。しかし上の観察により計算は単なる加算だけで済みます。
アルゴリズム
- 入力を受け取る。
- \(\text{ans} = \left(\sum T_i\right) + M \times R\) を計算する。
- \(\text{ans}\) を出力する。
計算量
- 時間計算量: \(O(N)\)(\(T_i\) の総和を取るだけ)
- 空間計算量: \(O(N)\)(入力配列を保持する分。保持せず逐次加算なら \(O(1)\) でも可能)
実装のポイント
答えは最大で \(\sum T_i \le 2\times10^5 \times 10^9 = 2\times10^{14}\)、さらに \(M R\) も加わるため、\(64\) bit 整数相当が必要です(Python の
intなら問題なし)。入力が大きいので、
sys.stdin.buffer.read()による高速入力にしておくと安全です。ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
N, M, R = data[0], data[1], data[2]
T = data[3:3+N]
ans = sum(T) + M * R
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: