饭馆菜品选择问题

80 阅读3分钟

题目解析

在豆包MarsCode AI刷题题库中,我选择了一道关于菜品选择的题目。题目要求在给定的菜品中选择一定数量的菜品,使得总价格最低,同时限制含有蘑菇的菜品数量。具体来说,题目给出了菜品的价格数组 a 和是否含有蘑菇的字符串 s,以及两个整数 mk,分别表示最多允许含有蘑菇的菜品数量和需要选择的菜品总数。

思路解析

  1. 理解题目:我们需要在满足最多含有 m 道蘑菇菜品的前提下,选择 k 道菜,使得总价格最小。
  2. 数据结构选择:我们可以将菜品按价格排序,这样可以从价格最低的菜品开始选择,以保证总价格最小。
  3. 算法步骤
    • 将菜品按价格排序,并记录是否含有蘑菇。
    • 尝试选择含有蘑菇的菜品数量从 0m
    • 对于每种蘑菇菜品的选择数量,选择价格最低的菜品,直到选满 k 道菜。
    • 计算每种选择情况下的总价格,并记录最小值。
    • 如果无法满足条件,返回 -1

图解: 假设我们有以下输入:

  • s = "001"
  • a = [10, 20, 30]
  • m = 1
  • k = 2

排序后的菜品为 [(10, '0'), (20, '0'), (30, '1')]。我们尝试选择 01 道蘑菇菜品:

  • 选择 0 道蘑菇菜品:选择 (10, '0')(20, '0'),总价格为 30
  • 选择 1 道蘑菇菜品:选择 (10, '0')(30, '1'),总价格为 40

最小总价格为 30

代码详解

def solution(s: str, a: list, m: int, k: int) -> int:
    dishes = sorted(zip(a, s))  # 将菜品按价格排序
    min_total_price = float('inf')  # 初始化最小总价格为无穷大
    
    for mushrooms in range(m + 1):  # 尝试选择含有蘑菇的菜品数量从0到m
        selected_dishes = []
        for price, has_mushroom in dishes:
            if has_mushroom == '1' and mushrooms > 0:
                selected_dishes.append(price)
                mushrooms -= 1
            elif has_mushroom == '0':
                selected_dishes.append(price)
        
        if len(selected_dishes) >= k:  # 如果选中的菜品数量等于k,计算总价格
            min_total_price = min(min_total_price, sum(selected_dishes[:k]))
    
    return -1 if min_total_price == float('inf') else min_total_price  # 如果无法选择满足条件的菜品,返回-1

知识总结

在使用豆包MarsCode AI刷题的过程中,我学到了以下新知识点:

  1. 排序与贪心算法:通过排序可以简化问题的复杂度,贪心算法可以在每一步选择最优解,从而达到全局最优。
  2. 组合选择问题:这类问题通常需要考虑多种组合情况,通过枚举和剪枝可以有效减少计算量。
  3. Python的zip函数zip 函数可以将多个列表合并为一个元组列表,便于同时处理多个列表的数据。

学习建议

  • 理解题目:在刷题前,务必仔细阅读题目描述,理解题目要求和限制条件。
  • 多练习:通过多次练习,熟悉不同类型的题目和解题思路。
  • 总结反思:每次刷题后,总结解题思路和遇到的困难,形成自己的知识体系。

学习计划

高效学习方法

  1. 制定刷题计划:根据自身情况,制定每日或每周的刷题计划,逐步提高难度。
  2. 利用错题进行针对性学习:将错题记录下来,分析错误原因,并进行针对性练习。
  3. 定期复习:定期回顾已解决的题目,巩固知识点。

工具运用

  1. 结合AI刷题功能:利用豆包MarsCode AI的智能提示和解析功能,快速理解题目和解题思路。
  2. 结合其他学习资源:如LeetCode、牛客网等,多渠道获取题目和解题思路。
  3. 参与讨论:加入刷题群或论坛,与其他学习者交流,分享解题思路和经验。

通过以上方法,可以有效提高刷题效率,巩固编程基础,提升解题能力。