“当青训营遇上码上掘金”

59 阅读2分钟

“当青训营遇上码上掘金”

时间点: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);
    }
}
```
```