はまやんはまやんはまやん

hamayanhamayan's blog

Factory [CODE THANKS FESTIVAL 2017 C]

https://code-thanks-festival-2017-open.contest.atcoder.jp/tasks/code_thanks_festival_2017_c

解法

https://code-thanks-festival-2017-open.contest.atcoder.jp/submissions/1825644

最適方針を考えてみると、プレゼントを作る機械は1つプレゼントを作るのにかかる時間が最短のものを貪欲に選んでいけばいいというのが思いつく。
今回は作るプレゼントは最大10^5個なので、愚直にこの方針で選んでいけばいい。
毎回O(N)で最短のものを探すとTLEなので、ここを高速化する。
priority_queueを使おう。
これで最短の作成時間のものを取り出す。
普通のpriority_queueでは大きいものから取り出す仕様なので、マイナスを使うか、以下の実装のように変換をして使おう。

template<typename T> using min_priority_queue = priority_queue<T, vector<T>, greater<T>>;
typedef long long ll;
int N, K;
ll A[101010], B[101010];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> K;
    rep(i, 0, N) cin >> A[i] >> B[i];

    min_priority_queue<pair<ll, int>> q;
    rep(i, 0, N) q.push({ A[i], i });

    ll ans = 0;
    rep(i, 0, K) {
        auto p = q.top(); q.pop();
        ans += p.first;
        q.push({ p.first + B[p.second], p.second });
    }
    cout << ans << endl;
}