算法:贪心 + 差分
时间复杂度:$O(N)$
一开始按照最长连续非 $0$ 区间段,但只过了 $7$ 个测试点,因为差分没用。
差分数组 $b$ 为:
$b[1] = h[1] - h[0]$
$b[2] = h[2] - h[1]$
$b[3] = h[3] - h[2]$
$.$
$.$
$.$
$b[n] = h[n] - h[n-1]$
将 $h$ 中的 $[L, R]$ 区间减一,则只需将 $b[L]$ 减一,$b[R+1]$ 加一,当 $h$ 数组中全为 $0$ 时,依据上式 $b$ 数组也全为 $0$,要使 $b$ 数组全为 $0$,则只需将 $\sum_{i=1}^{n} b[i],b[i] > 0$ 变为 $0$,与此同时的 $\sum_{i=1}^{n} b[i],b[i] < 0$ 也会变为 $0$,所以操作数就为 $\sum_{i=1}^{n} b[i],b[i] > 0$。
差分讲解可见:AcWing 797. 差分
C++ 代码
#include <iostream>
using namespace std;
int n, ans, last;
int main()
{
cin >> n;
while (n--) {
int h;
cin >> h;
if (h > last) ans += h - last;
last = h;
}
cout << ans << endl;
return 0;
}