饭馆菜品选择问题|豆包MarsCode AI刷题

53 阅读3分钟
这道题考察的是字符串操作,列表操作,循环和条件判定,边界条件处理和最小值更新。首先我们知道s是表示是否有蘑菇,a表示每道菜的价格,m表示所能接受蘑菇的数量,k表示点菜的总数量,让我们在满足这些条件的情况下所要的最大数量和最小价格,如果无法实现则输出-1。这道题的难点在于菜品的组合和边界条件,最小值更新和排序与列表操作。
解题思路:首先我们要知道这道题的关键点是小c希望点的菜里最多只有m到菜里有蘑菇,小c希望点的菜总数量是k,找到满足条件的最小总价格,然后我们需要分类,遍历字符串s,将有蘑菇的菜和没有蘑菇的菜分别存储在两个列表中,并对这两个列表中的菜品的价格进行从大到小的顺序排序,最后我们尝试不同的组合,选择 `i` 道含有蘑菇的菜和 `k - i` 道不含蘑菇的菜,其中 `i` 的范围是从 `0` 到 `Math.min(m, k)`。  对于每种组合,检查是否满足条件(即含有蘑菇的菜的数量不超过 `m`,且总数量为 `k`)。计算每种组合的总价格,并更新最小价格。
在这里面我们需要注意的是边界条件,如果k大于了菜单总数量(`withMushroom.size() +withoutMushroom.size()`),因无法满足条件则直接输出-1;组合选择,在尝试不同的组合时确保选择的有蘑菇的菜单数量不超过m,且总数量为k;最小价格更新时,在每次找到满足条件的组合都要更新最小价格。
写代码时使用charAt方法遍历字符串s,判定每道菜是否有蘑菇考察的是字符串操作;使用ArrayList存储有蘑菇和没有蘑菇的菜的价格和使用Collections.sort对列表进行排序考察的是列表操作;使用for循环遍历不同组合选出有蘑菇的菜的数量,使用if条件判定考察的是循环和条件判断;使用Long.MAX_VALUE初始化minCost,表示初始状态下没有找到任何满足条件的组合,而在每次找到一组满足条件的组合就要更新最小价格。从这道题我们能知道以后可以将问题分解成多个子问题,将抽象的问题转化为数学问题。
以下为解题代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static long solution(String s, int[] a, int m, int k) {
        List<Integer> withMushroom = new ArrayList<>();
        List<Integer> withoutMushroom = new ArrayList<>();
        
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '1') {
                withMushroom.add(a[i]);
            } else {
                withoutMushroom.add(a[i]);
            }
        }
        Collections.sort(withMushroom);
        Collections.sort(withoutMushroom);
        if (k > withMushroom.size() + withoutMushroom.size()) {
            return -1;
        }
        long minCost = Long.MAX_VALUE;
        for (int i = 0; i <= Math.min(m, k); i++) {
            int mushroomCount = i;
            int nonMushroomCount = k - i;
            if (mushroomCount <= withMushroom.size() && nonMushroomCount <= withoutMushroom.size()) {
                long cost = 0;
                for (int j = 0; j < mushroomCount; j++) {
                    cost += withMushroom.get(j);
                }
                for (int j = 0; j < nonMushroomCount; j++) {
                    cost += withoutMushroom.get(j);
                }
                minCost = Math.min(minCost, cost);
            }
        }
        return minCost == Long.MAX_VALUE ? -1 : minCost;
    }
    public static void main(String[] args) {
        System.out.println(solution("001", new int[]{10, 20, 30}, 1, 2) == 30);
        System.out.println(solution("111", new int[]{10, 20, 30}, 1, 2) == -1);
        System.out.println(solution("0101", new int[]{5, 15, 10, 20}, 2, 3) == 30);
    }
}