油管视频《编程思维》中的题目,使用C语言编写出来,第七集,觉醒塔

题目:假设有个由隐形柱子组成的容器,可以储存能量,能量每次都会从上方倾泻下来,一次填满一个单位立方体,隐形柱子的力场确保能量不会向前和向后流动,要求计算,被隐藏柱子围住的有多少个单位的能量流下来,计算不能多页不能少,必须刚好计算出,两侧隐形柱子,构建出的凹型容器般的,能够接住多少个能量单位,如同水一样,一旦有一侧隐形柱子过低,就像一个倾泻的木桶,取决于能量会如同水流出去多少的是桶的短板,我给出的图就是一个例子,能量落下的方式,让它只会在空间容纳量不够时泄露,假设我有一个机器人,每次都能让一个能量柱现形,并数出它的高度,但它不能一次看完整个结构,请文该如何让机器人算出,一个容器可以容纳多少能量?请按照问题给出指令。

涉及的编程基础原理

1,数组:用于存储柱子的高度。

2,循环:遍历数组,计算每个位置上能存储的能量。

3,条件判断:确定每个位置能存储的能量量。

4,双指针:用于优化计算过程。

要计算被柱子围住的能量单位数,我们需要知道每个位置上可以存储多少能量。这个能量的高度取决于该位置左右两边最高的柱子。具体来说,一个位置能存储的能量单位数等于左右两边最高柱子中较低的那个高度减去当前位置的柱子高度。

我们使用双指针法来优化这个计算过程。双指针分别从数组的两端向中间移动,通过比较左右两边的柱子高度,逐步计算能量单位数。

程序编写

#include <stdio.h>

// 函数声明
int calculateTrappedEnergy(int heights[], int size);

int main() {
    // 示例柱子高度
    int heights[] = {0, 1, 3, 2, 4, 1, 2, 5, 1, 2, 1};
    int size = sizeof(heights) / sizeof(heights[0]);

    // 计算并输出能量单位数
    int energy = calculateTrappedEnergy(heights, size);
    printf("被隐藏柱子围住的能量单位数: %d\n", energy);

    return 0;
}

// 计算被隐藏柱子围住的能量单位数
int calculateTrappedEnergy(int heights[], int size) {
    if (size <= 2) {
        return 0; // 少于3个柱子无法形成容器
    }

    int left = 0, right = size - 1;
    int left_max = 0, right_max = 0;
    int trapped_energy = 0;

    while (left < right) {//使用 while 循环,当 left 小于 right 时继续循环。

        if (heights[left] < heights[right]) {//如果左侧柱子的高度小于右侧柱子的高度,
            if (heights[left] >= left_max) {
                left_max = heights[left];
            } else {
                trapped_energy += left_max - heights[left];
            }
            left++;//

如果当前左侧柱子的高度大于等于 left_max,更新 left_max 为当前高度;

否则,累加 left_max 和当前高度的差值到 trapped_energy

然后将 left 指针向右移动一位。

        } else {
            if (heights[right] >= right_max) {
                right_max = heights[right];
            } else {
                trapped_energy += right_max - heights[right];
            }
            right--;//否则(即 heights[left] >= heights[right]),执行以下代码:

如果当前右侧柱子的高度大于等于 right_max,更新 right_max 为当前高度;

否则,累加 right_max 和当前高度的差值到 trapped_energy

然后将 right 指针向左移动一位。

        }
    }

    return trapped_energy;
}
 

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值