题目大意:一个洞穴的宽度为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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-14 09:54:31