贪心猫的鱼干大分配-题解

45 阅读3分钟

问题描述

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

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
  3. 小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

代码解析

1. 初始化

java
int[] a = new int[100001];

这行代码初始化了一个长度为100001的数组a,用于存储每只猫得到的鱼干数量。

2. 动态规划算法

java
public static int solution(int n, List<Integer> cats_levels) {
    Arrays.fill(a, 0);
    int res = 0;
    for (int i = 0; i < n; i++) {
        int t = 1;
        if (a[i] == 0) {
            if (i != 0 && cats_levels.get(i) > cats_levels.get(i - 1)) {
                t = a[i - 1] + 1;
            }
            a[i] = Math.max(dfs(i, n, cats_levels), t);
        }
        res += a[i];
    }
    return res;
}

这个函数是动态规划算法的核心。对于每只猫,我们考虑以下情况:

  • 如果这只猫之前没有被分配过鱼干(a[i] == 0),我们检查它是否比前一只猫等级高。如果是,它至少需要比前一只猫多一斤鱼干(t = a[i - 1] + 1)。
  • 我们使用dfs函数来处理当前猫和它后面的猫,确保等级高的猫得到的鱼干比等级低的猫多。
  • 最后,我们将每只猫得到的鱼干数量累加到结果res中。

3. 深度优先搜索(DFS)

java
public static int dfs(int x, int n, List<Integer> cats_levels) {
    if (x + 1 < n && cats_levels.get(x + 1) < cats_levels.get(x)) {
        return a[x] = dfs(x + 1, n, cats_levels) + 1;
    } else return a[x] = 1;
}

dfs函数是一个递归函数,用于确保等级高的猫得到的鱼干比等级低的猫多。如果当前猫的下一只猫等级更低,那么当前猫至少需要比下一只猫多一斤鱼干。

4. 主函数测试

java
public static void main(String[] args) {
    List<Integer> catsLevels1 = new ArrayList<>();
    catsLevels1.add(1);
    catsLevels1.add(2);
    catsLevels1.add(2);

    List<Integer> catsLevels2 = new ArrayList<>();
    catsLevels2.add(6);
    catsLevels2.add(5);
    catsLevels2.add(4);
    catsLevels2.add(3);
    catsLevels2.add(2);
    catsLevels2.add(16);

    List<Integer> catsLevels3 = new ArrayList<>();
    catsLevels3.add(1);
    catsLevels3.add(2);
    catsLevels3.add(2);
    catsLevels3.add(3);
    catsLevels3.add(3);
    catsLevels3.add(20);
    catsLevels3.add(1);
    catsLevels3.add(2);
    catsLevels3.add(3);
    catsLevels3.add(3);
    catsLevels3.add(2);
    catsLevels3.add(1);
    catsLevels3.add(5);
    catsLevels3.add(6);
    catsLevels3.add(6);
    catsLevels3.add(5);
    catsLevels3.add(5);
    catsLevels3.add(7);
    catsLevels3.add(7);
    catsLevels3.add(4);

    System.out.println(solution(3, catsLevels1) == 4);
    System.out.println(solution(6, catsLevels2) == 17);
    System.out.println(solution(20, catsLevels3) == 35);
}

main函数中,我们提供了几个测试用例来验证算法的正确性。这些测试用例覆盖了不同的输入情况,包括数字3、6和20。

注意事项

  • 在处理猫的等级时,确保遵守规则:等级高的猫应该得到更多的鱼干。
  • 在实际应用中,可能需要根据具体情况调整算法,以适应不同的需求和约束条件。

通过这个练习,我们不仅学习了如何使用动态规划和深度优先搜索来解决问题,还了解了如何编写健壮的代码来处理不同的输入情况。这对于任何涉及数据处理的编程任务都是一个重要的技能。