UVA - 1442 Cav

题目大意:一个洞穴的宽度为n(n<=10^6)个片段组成。第i处的地面高度为pi,顶高度为si(0=<pi<si<=1000),要求在洞中存放尽量多的燃料(液体),使得燃料的位置不会碰到顶,但可以无限接近。


解题思路:设每个片段中燃料的高度为l,初始值为是s[0]或s[n-1],如果当前片段的地面高度pi>l,则l=pi,顶高度si<l,则l=si,把每个片段的l存在数组中。从右往左扫一遍,再从左往右扫一遍,最后用片段中较小的l减去pi即该片段的燃料,所有相加,即为所求。


#include <cstdio>
#include <algorithm>
using namespace std;
int n, p[1000010], s[1000010], h[1000010];

int main() {
	int Z;
	scanf("%d", &Z);
	while (Z--) {
		scanf("%d", &n);
		for (int i = 0; i < n; i++)
			scanf("%d", &p[i]);
		for (int i = 0; i < n; i++)
			scanf("%d", &s[i]);

		int level = s[0];
		for (int i = 0; i < n; i++) {
			if (level > s[i]) level = s[i];
			if (level < p[i]) level = p[i];
			h[i] = level;
		}

		level = s[n-1];
		int ans = 0;
		for (int i = n - 1; i >= 0; i--) {
			if (level > s[i]) level = s[i];
			if (level < p[i]) level = p[i];
			ans += min(level, h[i]) - p[i];
		}
		printf("%d\n", ans);
	}
	return 0;
}


你可能感兴趣的:(UVA - 1442 Cav)