「青训营 X 码上掘金」主题创作4:攒青豆

201 阅读1分钟

当青训营遇上码上掘金

  1. 编辑环境:码上掘金

    • 浅试了一下码上掘金的在线代码编辑器,居然还能编辑输出框(好高级的感觉,是我不配了)
  2. 题目

    • 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积) image.png
  3. 思路:一眼雨水,鉴定为纯纯的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})
  4. 代码ID:7179127271859421216

  5. 源码

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