当青训营遇上码上掘金
-
编辑环境:码上掘金
- 浅试了一下码上掘金的在线代码编辑器,居然还能编辑输出框(好高级的感觉,是我不配了)
-
题目
- 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
- 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
-
思路:一眼雨水,鉴定为纯纯的dp
- 首先我们可以发现对于每一列而言,青豆的数量不会超过两侧最高的最矮的(超过就漏了),所以对于每一列可以放min(left[i],right[i])-height[i]个青豆
- (其中left[i]是从左往右的最高序列PS:本图中left为{5,5,5,5,5,5,5,5,5},right[i]是从右往左的最高序列PS:本体right为{3,3,3,3,4,4,4,4,5})
- 首先我们可以发现对于每一列而言,青豆的数量不会超过两侧最高的最矮的(超过就漏了),所以对于每一列可以放min(left[i],right[i])-height[i]个青豆
-
代码ID:7179127271859421216
-
源码
#include<iostream>
#include<string.h>
using namespace std;
const int len=1000;
int aleft[len];
int aright[len];
int ans;
int solve(int height[],int l) {
aleft[0]=height[0];
for (int i=1;i<l;i++) {
aleft[i]=max(height[i],aleft[i-1]);
}
aright[l-1]=height[l-1];
for (int i=l-1-1;i>=0;i--) {
aright[i]=max(height[i],aright[i+1]);
}
for (int i=1;i<l-1;i++) {
ans+=min(aleft[i],aright[i])-height[i];
}
return ans;
}
int main() {
int height[] = {5,0,2,1,4,0,1,0,3};
int l = sizeof(height)/sizeof(height[0]);
cout<<solve(height,l);
return 0;
}