问题描述
有 nn 棵树,每棵树的高度为 a_i,每棵树在高度 b_i 处有一个果子。
小C从第一棵树的 0 高度位置出发,她需要通过移动来吃到所有的果子。她可以执行以下两种操作:
- 调整自己的高度,即从当前高度变为高度 x+1x+1 或 x−1x−1,需要保证调整后的高度仍在 0 到当前树的最大高度
a_i之间。 - 从第 ii 棵树的高度 xx 移动到第 i+1i+1 棵树的高度,要求 x≤ai+1x≤ai+1,且不能超过下一棵树的最大高度。
做题思路
小C的目标是尽量少操作,吃到所有的果子,输出他所需要的最小操作次数。
本题的目标是要让小 C 通过最少的操作次数吃到所有树上特定高度处的果子。整体思路围绕着逐个处理每棵树,在每棵树上根据当前小 C 的高度与果子所在高度的关系进行调整操作,然后再考虑移动到下一棵树时的高度调整及水平移动操作,以此来累计计算出吃到所有果子所需的最少操作次数。
long solution(const std::vector<int>& a, const std::vector<int>& b) {
int n = a.size();
long operations = 0;
int current_height = 0;
for (int i = 0; i < n; ++i) {
if (current_height < b[i]) {
// Move up to the fruit height
operations += (b[i] - current_height);
current_height = b[i];
} else if (current_height > b[i]) {
// Move down to the fruit height
operations += (current_height - b[i]);
current_height = b[i];
}
if (i < n - 1) {
// Move to the next tree
if (current_height > a[i + 1]) {
// If current height is higher than the next tree's max height, adjust down
operations += (current_height - a[i + 1]);
current_height = a[i + 1];
}
// Move horizontally to the next tree
operations += 1;
}
}
return operations;
}
具体步骤如下:
-
初始化相关变量:
- 记录树的数量
n,通过获取输入向量a的大小来确定。 - 初始化操作次数
operations为 0,表示还未进行任何操作。 - 将小 C 的初始高度
current_height设置为 0,因为她从第一棵树的 0 高度位置出发。
- 记录树的数量
-
遍历每棵树:
-
对于每一棵当前树(索引为
i),首先比较小 C 当前的高度current_height和当前树上果子所在的高度b[i]。- 如果当前高度小于果子所在高度,那么小 C 需要向上移动到果子所在高度,此时操作次数要增加两者的高度差,并且更新小 C 的当前高度为果子所在高度。
- 如果当前高度大于果子所在高度,那么小 C 需要向下移动到果子所在高度,同样操作次数增加两者的高度差,并更新当前高度。
-
在处理完当前树上吃到果子的操作后,如果还不是最后一棵树(即
i < n - 1),需要考虑移动到下一棵树的情况。- 先判断当前小 C 的高度是否高于下一棵树的最大高度
a[i + 1]。如果是,那么需要向下调整高度到不超过下一棵树的最大高度,操作次数增加相应的高度差,并更新当前高度。 - 最后,无论当前高度与下一棵树最大高度关系如何,都需要进行一次水平移动操作到下一棵树,所以操作次数增加 1。
- 先判断当前小 C 的高度是否高于下一棵树的最大高度
-
-
遍历完所有树后,此时
operations中记录的就是小 C 吃到所有果子所需要的最小操作次数,将其返回即可。