算法知识点: 差分,贪心
复杂度:
解题思路:
我们逆向思考:假设给定了每块积木的高度,每次可以将某一段区间中的所有高度减一,问最少操作多少次可以将所有高度变成0。
原序列是: , 其中 。
构造差分序列:
...
则将 中的每个数减1的操作,等价于将 减1, 将 加1。
因此问题变成每次从 中挑两个数,前一个减1,后一个加1,问最少操作多少次可以将所有数变成0。
对于每个正数 ,最少需要操作 次,因此总操作次数等于差分数组中所有正数之和 。
C++ 代码:
#include <iostream> #include <algorithm> using namespace std; const int N = 100010; int n; int h[N]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &h[i]); int res = 0; for (int i = n; i; i--) res += max(0, h[i] - h[i - 1]); cout << res << endl; return 0; }