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

38 阅读2分钟

问题描述

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

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

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

问题理解

你需要为每只猫分配鱼干,确保每只猫至少得到一斤鱼干,并且等级高的猫得到的鱼干比相邻等级低的猫多。

数据结构选择

  • 使用一个列表 fish_amounts 来存储每只猫分配到的鱼干数量。
  • 初始时,每只猫至少得到一斤鱼干。

算法步骤

  1. 初始化

    • 创建一个列表 fish_amounts,初始值为1,表示每只猫至少得到一斤鱼干。
  2. 从左到右遍历

    • 遍历 cats_levels,如果当前猫的等级高于前一只猫,则增加当前猫的鱼干数量,确保其比前一只猫多。
    • 但是,这个遍历并不能保证每只猫的鱼干数量比它右边等级低的猫多,因为只考虑了左边的相邻猫。
  3. 从右到左遍历

    • 再次遍历 cats_levels,从右到左,如果当前猫的等级高于后一只猫,则增加当前猫的鱼干数量,确保其比后一只猫多。
    • 通过这个遍历,我们可以修正那些在第一次遍历时没有考虑到的情况。
  4. 计算总鱼干数量

    • 遍历 fish_amounts,累加所有猫的鱼干数量,得到最终结果。

关键点

  • 两次遍历确保每只猫的鱼干数量满足条件。
  • 使用 Math.max 确保在第二次遍历时,鱼干数量不会减少。
import java.util.ArrayList;
import java.util.List;

public class Main {
    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;
    }

    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);
    }
}