“当青训营遇上码上掘金”
时间点:2023-2-14 00:30,临时阅读到第五届青训营和码上掘金的帖子,出于兴趣好奇,浅尝试了一下,并未考虑普适情况也有待修改完善,仅展示学习思路
题目: 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积) 以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
出于速度和先解题后完善逻辑,我仅是针对这一种例子进行的作答,望不要太过考究。
package project.ex4;// 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。
// 输入:height = [5,0,2,1,4,0,1,0,3]
// 输出:17
// 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
// 思路: 首先确定最左边的柱子高度,然后从左向右遍历,找到右侧中最高的柱子,计算这之间的总面积,再减去其中柱子的体积;再计算最高的柱子和最右边的柱子之间的面积,再减去其中柱子的体积;两者相加即为总面积
import java.util.Scanner;
public class bean1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入柱子的个数:");
int n = sc.nextInt();
int[] height = new int[n];
for (int i = 0; i < n; i++) {
height[i] = sc.nextInt();
}
int max = 0;
int maxIndex = 0;
for (int i = 1; i < n; i++) {
if (height[i] > max) {
max = height[i];
maxIndex = i;
}
}
// 计算总面积
int sum1 = 0;
int h1 = 0;
h1 = Math.min(height[0], max);
sum1 = h1 * (maxIndex - 1);
System.out.println(sum1);
for (int i = 1; i < maxIndex; i++) {
sum1 -= height[i];
}
System.out.println(sum1);
int sum2 = 0;
int h2 = 0;
h2 = Math.min(height[n - 1], max);
sum2 = h2 * (n - 1 - maxIndex - 1);
for (int i = n - 2; i > maxIndex; i--) {
sum2 -= height[i];
}
System.out.println(sum2);
int sum = 0;
sum = sum1 + sum2;
System.out.println(sum);
}
}
```
```