青训营x豆包Mars codeAI训练

87 阅读3分钟

为了解决“贪心猫的鱼干大分配”问题,我们需要根据每只猫的等级,确保每只猫得到的鱼干数量至少比相邻等级较低的猫多,同时满足每只猫至少得到一斤鱼干的要求。这个问题可以通过动态规划的方法来解决,但也可以利用贪心策略结合局部调整来实现。

分析

  1. 基本假设:每只猫至少得到一斤鱼干。
  2. 等级差异:如果一只猫的等级高于相邻的猫,它得到的鱼干数量必须比相邻的猫多。

思路

我们可以从左到右和从右到左各遍历一次,确保每次遇到等级更高的猫时,适当增加其鱼干数量以满足规则。

  1. 从左到右遍历
    • 初始化每只猫至少得到一斤鱼干。
    • 如果当前猫的等级高于前一个猫,则当前猫的鱼干数量应比前一个猫多至少1斤。
  2. 从右到左遍历
    • 再次检查,确保当前猫的等级高于后一个猫时,其鱼干数量应比后一个猫多至少1斤(这里的“多至少1斤”是基于从左到右遍历后的结果再增加的,不是基于初始的1斤)。

实现

以下是基于上述思路的Python代码实现:

python复制代码def min_fish_dry(n, cats_levels):      # 初始化每只猫至少得到一斤鱼干      fish = [1] * n            # 从左到右遍历,确保右边等级高的猫比左边的猫多得到鱼干      for i in range(1, n):          if cats_levels[i] > cats_levels[i - 1]:              fish[i] = max(fish[i], fish[i - 1] + 1)            # 从右到左遍历,确保左边等级高的猫比右边的猫多得到鱼干      for i in range(n - 2, -1, -1):          if cats_levels[i] > cats_levels[i + 1]:              fish[i] = max(fish[i], fish[i + 1] + 1)            # 计算总鱼干数量      total_fish = sum(fish)      return total_fish    # 测试样例  print(min_fish_dry(3, [1, 2, 2]))  # 输出: 4  print(min_fish_dry(6, [6, 5, 4, 3, 2, 16]))  # 输出: 17  print(min_fish_dry(20, [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]))  # 输出: 35

学习心得

  1. 贪心策略与动态规划:虽然这个问题可以通过动态规划来解决,但贪心策略结合局部调整同样有效。关键在于确保每次调整都满足等级差异的要求。

  2. 双向遍历:从左到右和从右到左的双向遍历确保了无论猫的等级在左侧还是右侧有变化,都能得到正确的鱼干数量。这种方法避免了复杂的状态转移方程,使得代码更加直观易懂。

  3. 边界条件:初始化时,每只猫至少得到一斤鱼干,这是满足题目要求的基础。在双向遍历过程中,每次调整都是基于这个基础进行的。

  4. 代码简洁性:通过简单的循环和条件判断,实现了问题的求解,代码简洁且易于维护。

通过这个问题,我们可以学习到如何运用贪心策略结合局部调整来解决实际问题,以及如何有效地进行双向遍历来满足题目中的多种约束条件