当青训营遇上码上掘金之攒青豆

28 阅读2分钟

image.png

当青训营遇上码上掘金

主题创作题目

现有 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);
	
}