码题杯 方块桶 题型:双指针

41 阅读1分钟

码题集OJ-方块桶 (matiji.net)

样例解析

如下图所示,一共可以灌满6个方块 image.png

思想

我们去枚举每一个点,对于每一个点都找其左边的最高点,右边的最高点。

比如对于x1点来说,其左边最高点是l1,右边最高点是r1。 image.png

根据木桶原理,木桶能装多少水取决于短板的高度。

又因为l1<r1,所以x1最多装水只能装到l1高度。能装多少水可以用公式:l1x1l1-x1计算出。

再举个例子,对于x2来说,其左边最高点是l2,右边最高点是r2。

image.png

因为l2<r2,所以x2处的水最高只能装到l2处,装水容量用公式l2x2l2-x2可以计算出来。

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;
}

image.png