怠惰の累積和

技術/競プロ/怪文書/虚無

KEYENCE Programming Contest 2019 C - Exam and Wizard

問題概要

 N個の数列AとBに対し、Aの総和と総和が等しく、且つB[i]<=C[i](0<=i<=N-1)となる数列Cを構成する時のA[i]からC[i]への書き換える個数を最小化する。

atcoder.jp

 

解法

 まず、明らかにAの総和がBの総和よりも小さい場合、Cは総和がAと同じでなければならないため、構成することができない(-1を出力)。

 次に、すべてのA[i]に対し、B[i]がそれ以下であるなら、書き換える必要は当然生じない(0を出力)。

 最後に、マスを書き換える個数を最小化する事を考えると、A[i]<B[i]のマスは書き換える必要がある。その為、その差を持っておき(A[i]-B[i]をdis[i]として持った)、dis[i]の中で負の数を全て足し合わせ、それをdis[i]の大きい方から埋めていくことで最小値を達成できるので、これらを実装してあげて、AC。

atcoder.jp