B - 工場の機械メンテナンス / Factory Machine Maintenance Editorial by admin
GPT 5.2 High概要
各機械の作業時間 \(T_i\) は必ず全て足され、工具整備時間 \(R_i\) は「最後に作業した機械」だけ不要になります。したがって「最後に回す機械をどう選ぶか」だけを考えれば最短時間が求まります。
考察
機械をある順番でメンテナンスすると、時間の流れは
- 機械の作業:\(T\)
- (最後以外)工具整備:\(R\)
- 次の機械へ…
となります。
ここで重要なのは次の2点です。
全ての \(T_i\) は順番に関係なく必ず合計される
どの順番でも、全機械を1回ずつ作業するので合計作業時間は常に \(\\sum T_i\) です。\(R_i\) は「最後に作業した機械」だけ発生しない
最後の機械の後には次の作業が無いので工具整備が不要です。
つまり、発生する工具整備時間の合計は
[ \sum Ri - R{\text{last}} ] となります(\(R_{\text{last}}\) は最後に選んだ機械の \(R\))。
よって、総時間は [ \sum T_i + \left(\sum Ri - R{\text{last}}\right) ] です。これを最小にするには、引かれる値 \(R_{\text{last}}\) を最大にすればよいので、最後に回す機械は \(R_i\) が最大のものが最適です。
素朴に全ての順番(\(N!\) 通り)を試すのは \(N \le 2\times 10^5\) では不可能です。しかし上の観察により、順番全体を考える必要はなく「最大の \(R_i\) を最後にする」だけで解けます。
例:\((T,R)=(3,5),(10,2),(4,7)\) のとき
[
\sum T=17,\ \sum R=14,\ \max R=7
]
最短時間は
[
17+14-7=24
]
(\(R=7\) の機械を最後にすればよい)。
アルゴリズム
- \(\\text{sum\_t} = \sum T_i\) を計算する
- \(\\text{sum\_r} = \sum R_i\) を計算する
- \(\\text{max\_r} = \max R_i\) を求める
- 答えを [ \text{sum_t} + \text{sum_r} - \text{max_r} ] として出力する
計算量
- 時間計算量: \(O(N)\)(1回の走査で合計と最大を取るだけ)
- 空間計算量: \(O(1)\)(入力を保持せず集計値のみ)
実装のポイント
\(T_i, R_i\) は最大 \(10^9\)、\(N\) は最大 \(2\times 10^5\) なので、合計は最大で約 \(2\times 10^{14}\) になります。Python の
intなら安全ですが、他言語では 64bit 整数を使います。全データを配列に保存する必要はなく、読みながら
sum_t,sum_r,max_rを更新すれば十分です。ソースコード
import sys
def main():
input = sys.stdin.readline
N = int(input())
sum_t = 0
sum_r = 0
max_r = 0
for _ in range(N):
t, r = map(int, input().split())
sum_t += t
sum_r += r
if r > max_r:
max_r = r
print(sum_t + sum_r - max_r)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: