公式

E - 山型整地 / Mountain-Shaped Leveling 解説 by sounansya


\(H\) の差分を考えると、操作は \(1\le i < j\le N\) を選び \(i\) 番目に \(-1\) を、\(j\) 番目に \(-1\) を足す操作になります。

また、判定は \(H\) の差分がある場所まで非負、ある場所以降は非正、という形に言い換えられます。

これは非負と非正が切り替わる部分を全探索して最小値を計算することで求めることができます。ある場所まで非負にする操作回数の最小値は負の要素の総和の \(-1\) 倍なので、高速に計算することができます。非正の場合も同様です。

実装例(Python3)

n = int(input())
h = list(map(int, input().split()))
w = [h[i + 1] - h[i] for i in range(n - 1)]


def gen(w):
    a = [0]
    for v in w:
        a.append(a[-1] + max(0, -v))
    return a


a = gen(w)
b = gen([-v for v in w[::-1]])[::-1]
print(min(a[i] + b[i] for i in range(n)))

投稿日時:
最終更新: