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