样例解析
如下图所示,一共可以灌满6个方块
思想
我们去枚举每一个点,对于每一个点都找其左边的最高点,右边的最高点。
比如对于x1点来说,其左边最高点是l1,右边最高点是r1。
根据木桶原理,木桶能装多少水取决于短板的高度。
又因为l1<r1,所以x1最多装水只能装到l1高度。能装多少水可以用公式:计算出。
再举个例子,对于x2来说,其左边最高点是l2,右边最高点是r2。
因为l2<r2,所以x2处的水最高只能装到l2处,装水容量用公式可以计算出来。
code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int x[N];
int n, ans, maxl, maxr;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> x[i];
maxl = x[1], maxr = x[n];
int l = 1, r = n;
while (l < r) {
if (maxl <= maxr) {
l++;
maxl = max(maxl, x[l]);
ans += maxl - x[l];
} else {
r--;
maxr = max(maxr, x[r]);
ans += maxr - x[r];
}
}
cout << ans;
return 0;
}