题目解析:贪心猫的鱼干大分配|豆包MarsCode AI刷题

49 阅读2分钟

问题描述

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

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

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

解题思路

题目分析

这个问题涉及到如何根据猫的等级差异公平分配鱼干。关键在于理解如何根据猫的等级来确定每只猫应该得到的鱼干数量。

解答思路

  1. 初始化:首先,为每只猫分配至少一斤鱼干。
  2. 左到右遍历:从左到右遍历猫的等级列表,确保每只猫得到的鱼干数不小于其左侧猫的等级。
  3. 右到左遍历:从右到左遍历猫的等级列表,确保每只猫得到的鱼干数不小于其右侧猫的等级。
  4. 计算总数:累加每只猫得到的鱼干数,得到总鱼干数。

代码详解

1. 初始化鱼干数组

List<Integer> fish = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
    fish.add(1);
}

为每只猫初始化一斤鱼干。

2. 从左到右遍历,确保每只猫的鱼干数满足其左侧的等级要求

for (int i = 1; i < n; i++) {
    if (catsLevels.get(i) > catsLevels.get(i - 1)) {
        fish.set(i, fish.get(i - 1) + 1);
    }
}

如果当前猫的等级高于左侧猫,增加一斤鱼干。

3. 从右到左遍历,确保每只猫的鱼干数满足其右侧的等级要求

for (int i = n - 2; i >= 0; i--) {
    if (catsLevels.get(i) > catsLevels.get(i + 1)) {
        fish.set(i, Math.max(fish.get(i), fish.get(i + 1) + 1));
    }
}

如果当前猫的等级高于右侧猫,确保鱼干数不少于右侧猫。

4. 计算总鱼干数

int totalFish = 0;
for (int i = 0; i < n; i++) {
    totalFish += fish.get(i);
}

累加所有猫得到的鱼干数。

完整代码

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static int solution(int n, List<Integer> catsLevels) {
        List<Integer> fish = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
            fish.add(1);
        }

        for (int i = 1; i < n; i++) {
            if (catsLevels.get(i) > catsLevels.get(i - 1)) {
                fish.set(i, fish.get(i - 1) + 1);
            }
        }

        for (int i = n - 2; i >= 0; i--) {
            if (catsLevels.get(i) > catsLevels.get(i + 1)) {
                fish.set(i, Math.max(fish.get(i), fish.get(i + 1) + 1));
            }
        }

        int totalFish = 0;
        for (int i = 0; i < n; i++) {
            totalFish += fish.get(i);
        }

        return totalFish;
    }

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