当青训营遇上码上掘金
主题创作题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
思路
使用数组layout 记录摆放柱子的布局。依次输入柱子的布局。每放入一个柱子,就根据下文的判断和计算方式,来得出填装豆子后的新的高度。将高度填入height中。每次添加新的柱子便更新一遍height中的值,直到最后一个柱子放入,得到填装豆子后每一个单位区域的高度。再将height中每一个单位区域的高度,减去layout柱子本身占用的高度,即为豆子的总量。
- 判断方式
当对于已经填入豆子的图形,再后续添加一个柱子时(没有柱子相当于添加了一个高度为0的柱子),只有当添加的柱子的高度height大于上一个添加的柱子的高度height时,才需要计算和更改每个单位的height(即填入豆子的数量有所变化)。当添加的新柱子高度等于或小于上一个添加的柱子时候,每个单位的height(即豆子数量没有变化)。
- 计算方式
(没有添加柱子相当于添加了一个高度为0的柱子) 有2种情况:1.一开始就柱子的高度就单调增,此时并不需要修改每个单位的height的值。2.新添加的一个柱子,使得临近的一个图形形成一个U(即添加了一个柱子,使得前面的一个数值递增),此时查看u的两端左边高还是右边高,豆子填装的高度height取决于较低的那一端,然后两端内部的height用较低的那一端高度填充。此时就完成了添加一个柱子时的height更新
代码实现
#include <iostream>
typedef struct sb{
int layout;
int heigh;
int down_flat_up;
}sb;
int main(){
sb a[9];
a[0].down_flat_up=-2;
for (int again=1;again<9;again++){
if(a[again-1].heigh-a[again].heigh>0) a[again].down_flat_up=-1;
if(a[again-1].heigh-a[again].heigh==0) a[again].down_flat_up=0;
if(a[again-1].heigh-a[again].heigh<0) a[again].down_flat_up=1;
}
int i=0;
while(i<9){
scanf("%d",&a[i].layout);
a[i].heigh=a[i].layout;
i++;
}
for(int j=1;j<9;j++){
if(a[j-1].heigh-a[j].heigh>0) a[j].down_flat_up=-1;
if(a[j-1].heigh-a[j].heigh==0) a[j].down_flat_up=0;
if(a[j-1].heigh-a[j].heigh<0) {
a[j].down_flat_up=1;
int max_number,max_heigh_number;
for(int k=j-1;k>=1;k--){
if(a[k].heigh>=a[j].heigh){
max_heigh_number=a[j].heigh;
max_number=k;
break;
}
if(k==1 &&a[k].down_flat_up==-1) {
max_number=0;
max_heigh_number=a[0].heigh;
}
}
int std_heigh;
if(a[j].heigh>=max_heigh_number)std_heigh=max_heigh_number;
else std_heigh=a[j].heigh;
for(int m=max_number+1;m<j;m++) a[m].heigh=std_heigh;
for (int again=1;again<9;again++){
if(a[again-1].heigh-a[again].heigh>0) a[again].down_flat_up=-1;
if(a[again-1].heigh-a[again].heigh==0) a[again].down_flat_up=0;
if(a[again-1].heigh-a[again].heigh<0) a[again].down_flat_up=1;
}
}
}
int sum_column=0;
int sum_heigh=0;
for(int l=0;l<=8;l++){
sum_column=sum_column+a[l].layout;
sum_heigh=sum_heigh+a[l].heigh;
}
printf("%d",sum_heigh-sum_column);
}