小C吃果子 | 青训营刷题

86 阅读3分钟

问题描述

有 nn 棵树,每棵树的高度为 a_i,每棵树在高度 b_i 处有一个果子。

小C从第一棵树的 0 高度位置出发,她需要通过移动来吃到所有的果子。她可以执行以下两种操作:

  1. 调整自己的高度,即从当前高度变为高度 x+1x+1 或 x−1x−1,需要保证调整后的高度仍在 0 到当前树的最大高度 a_i 之间。
  2. 从第 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;
}

具体步骤如下:

  1. 初始化相关变量:

    • 记录树的数量 n,通过获取输入向量 a 的大小来确定。
    • 初始化操作次数 operations 为 0,表示还未进行任何操作。
    • 将小 C 的初始高度 current_height 设置为 0,因为她从第一棵树的 0 高度位置出发。
  2. 遍历每棵树:

    • 对于每一棵当前树(索引为 i),首先比较小 C 当前的高度 current_height 和当前树上果子所在的高度 b[i]

      • 如果当前高度小于果子所在高度,那么小 C 需要向上移动到果子所在高度,此时操作次数要增加两者的高度差,并且更新小 C 的当前高度为果子所在高度。
      • 如果当前高度大于果子所在高度,那么小 C 需要向下移动到果子所在高度,同样操作次数增加两者的高度差,并更新当前高度。
    • 在处理完当前树上吃到果子的操作后,如果还不是最后一棵树(即 i < n - 1),需要考虑移动到下一棵树的情况。

      • 先判断当前小 C 的高度是否高于下一棵树的最大高度 a[i + 1]。如果是,那么需要向下调整高度到不超过下一棵树的最大高度,操作次数增加相应的高度差,并更新当前高度。
      • 最后,无论当前高度与下一棵树最大高度关系如何,都需要进行一次水平移动操作到下一棵树,所以操作次数增加 1。
  3. 遍历完所有树后,此时 operations 中记录的就是小 C 吃到所有果子所需要的最小操作次数,将其返回即可。