贪心猫的鱼干大分配问题|豆包MarsCode AI刷题

130 阅读3分钟

问题描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。

小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

题目解析

题目描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。

小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

解题思路

  1. 理解问题

    • 每只猫至少得到1斤鱼干。
    • 如果一只猫的等级高于相邻的猫,它应该得到比相邻的猫更多的鱼干。
  2. 数据结构选择

    • 使用一个列表 fish_amounts 来记录每只猫的鱼干数量。
  3. 算法步骤

    • 初始化每只猫的鱼干数量为1。
    • 从左到右遍历猫的等级列表,确保每只猫的鱼干数量满足条件。
    • 从右到左遍历猫的等级列表,再次确保每只猫的鱼干数量满足条件。
    • 计算总的鱼干数量并返回。

图解

假设有以下猫的等级列表 [1, 2, 2]

  1. 初始化鱼干数量:[1, 1, 1]
  2. 从左到右遍历:
    • 第二只猫等级高于第一只猫,鱼干数量变为 [1, 2, 1]
  3. 从右到左遍历:
    • 第三只猫等级等于第二只猫,鱼干数量不变 [1, 2, 1]
  4. 总鱼干数量:1 + 2 + 1 = 4

代码详解

public static int solution(int n, List<Integer> cats_levels) {
    // 初始化每只猫至少得到一斤鱼干
    List<Integer> fish_amounts = new ArrayList<>();
    for (int i = 0; i < n; i++) {
        fish_amounts.add(1);
    }

    // 从左到右遍历,确保每只猫的鱼干数量满足条件
    for (int i = 1; i < n; i++) {
        if (cats_levels.get(i) > cats_levels.get(i - 1)) {
            // 如果当前猫的等级高于前一只猫,增加鱼干数量
            fish_amounts.set(i, fish_amounts.get(i - 1) + 1);
        }
    }

    // 从右到左遍历,确保每只猫的鱼干数量满足条件
    for (int i = n - 2; i >= 0; i--) {
        if (cats_levels.get(i) > cats_levels.get(i + 1)) {
            // 如果当前猫的等级高于后一只猫,增加鱼干数量
            fish_amounts.set(i, Math.max(fish_amounts.get(i), fish_amounts.get(i + 1) + 1));
        }
    }

    // 计算总的鱼干数量
    int total_fish = 0;
    for (int amount : fish_amounts) {
        total_fish += amount;
    }

    return total_fish;
}

知识总结

新知识点

  • 贪心算法:通过局部最优解来达到全局最优解。
  • 双遍历:从左到右和从右到左两次遍历,确保每只猫的鱼干数量满足条件。

理解与建议

  • 贪心算法的应用:在处理类似分配问题时,贪心算法通常能提供高效的解决方案。
  • 双遍历的必要性:确保每只猫的鱼干数量在两个方向上都满足条件,避免遗漏。

学习计划

高效学习方法

  1. 制定刷题计划

    • 每天固定时间刷题,逐步增加题目难度。
    • 每周总结错题,分析错误原因并进行针对性练习。
  2. 利用错题进行针对性学习

    • 记录错题,分析错误原因。
    • 针对错误类型进行专项练习,巩固知识点。

工具运用

结合AI刷题功能

  1. AI辅助分析

    • 使用AI工具分析代码,找出潜在问题和优化点。
    • 利用AI生成测试用例,验证代码的正确性。
  2. 结合其他学习资源

    • 结合在线课程、书籍等资源,全面提升编程能力。
    • 参与编程社区,与他人交流学习心得,共同进步。

通过以上方法,可以更高效地利用AI刷题功能,提升编程水平。