ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

【AtCoder版!蟻本】CODE THANKS FESTIVAL 2017 C - Factory【priority-queue】

f:id:ebisuke33:20210801003043p:plain


AtCoder版!蟻本のpriority-queueの例題としてあげられているABC012 D - バスと避けられない運命をPythonで解いていきます。

C - Factory

C - Factory

問題文

工場にプレゼントを作る機械が N 台あります。i ( 1 ≦ i ≦ N ) 番目の機械は、最初 ai 秒でプレゼントを 1 個作れます。
しかし、ある機械でプレゼントを 1 個作るたびにその機械のみが劣化して、プレゼントを 1 個作るのにかかる時間が bi 秒増えます。
したがって、i ( 1 ≦ i ≦ N ) 番目の機械で si 個目のプレゼントを作るのに ai+( si − 1 )×bi 秒かかります。
また、工場に供給される電力が少ないため、複数の機械を同時に動かすことはできません。

イルカはプレゼント K 個をできる限り短い時間で製造したいです。
プレゼントの製造にかかる最小の合計時間を求めてください。

制約

・1 ≦ N ≦ 10^5
・1 ≦ K ≦ 10^5
・1 ≦ ai ≦ 10^9
・0 ≦ bi ≦ 10^9
・入力は全て整数である。

解答例

import heapq

n, k = map(int,input().split())

A = []
B = []
for i in range(n):
    a, b = map(int,input().split())
    heapq.heappush(A, (a, i))
    B.append(b)

ans = 0
for i in range(k):
    tmp, j = heapq.heappop(A)
    ans += tmp
    heapq.heappush(A, (tmp + B[j], j))

print(ans)

解説

K個のプレゼントを作る最短時間を求める問題で、優先度付きキューを用いて解きました。

N台の機会において劣化なしの製造時間Aiを配列Aにいれていきます。

K個のプレゼントを作る時間をansとして、Aの最小値をtmpとして足し合わせていきました。
同時にAに劣化後の製造時間をいれていきます。

このループを抜けたあとにansを出力すればOKでした。




AtCoder版!蟻本(初級編)の記事リンクページはこちら
ebisuke33.hatenablog.com