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

59 阅读3分钟

在这道题中,给定了饭馆中的菜品信息,包括每道菜的价格和是否含有蘑菇。小C希望在满足一定条件的情况下,选出一些菜品。我们需要帮助她找出在这些条件下,所选菜品的最小总价格。具体问题如下:

  • 输入

    • s:一个字符串,表示每道菜是否含有蘑菇,s[i] = '1' 表示第 i 道菜含有蘑菇,s[i] = '0' 表示第 i 道菜没有蘑菇。
    • a:一个整数列表,表示每道菜的价格。
    • m:表示小C最多可以选择的蘑菇菜品数。
    • k:表示小C需要选择的菜品总数。
  • 目标:选择恰好 k 道菜,使得它们的总价格尽可能低,并且其中含有蘑菇的菜品最多为 m 道。如果无法选择满足条件的菜品,返回 -1

思路与解法

  1. 划分菜品类别

    • 首先,我们需要将菜品按是否含有蘑菇进行划分,分为两类:一类是含有蘑菇的菜品,另一类是没有蘑菇的菜品。对于这两类菜品,我们分别提取出它们的价格,并进行排序。这样我们可以通过从价格较低的菜品开始选择,从而得到最小的总价格。
  2. 计算可能的选择方案

    • 我们需要从两类菜品中选出总共 k 道菜。具体地,我们选择从含有蘑菇的菜品中选择 mushroom_count 道菜,从没有蘑菇的菜品中选择 non_mushroom_count = k - mushroom_count 道菜。为了确保选择的菜品总数为 k,我们需要保证 mushroom_count <= m(即最多 m 道含蘑菇的菜品)且 non_mushroom_count 不超过没有蘑菇的菜品数。
  3. 边界条件和约束

    • 如果含有蘑菇的菜品数超过 m,则该方案不可行。
    • 如果选择的菜品数大于菜品的总数,则也是不合法的。
    • 如果不能满足选出 k 道菜的条件,返回 -1
  4. 求解最小总价格

    • 对每种可能的 mushroom_count(含蘑菇的菜品数量),计算对应的 non_mushroom_count,并求得这两类菜品的最小总价格。如果存在有效的选择方案,则返回最小的总价格,否则返回 -1
def solution(s: str, a: list, m: int, k: int) -> int:
    # 按是否含有蘑菇划分两类菜品
    mushroom_dishes = []
    non_mushroom_dishes = []
    
    # 将菜品按是否含蘑菇进行分类
    for i in range(len(s)):
        if s[i] == '1':
            mushroom_dishes.append(a[i])
        else:
            non_mushroom_dishes.append(a[i])
    
    # 对两类菜品的价格排序
    mushroom_dishes.sort()
    non_mushroom_dishes.sort()
    
    # 如果 k 道菜中不允许有 m 道以上含蘑菇的菜,计算可能性
    min_price = float('inf')
    
    # 遍历可能选择的蘑菇菜数量
    for mushroom_count in range(min(k, len(mushroom_dishes)) + 1):
        if mushroom_count > m:
            continue
        
        non_mushroom_count = k - mushroom_count
        
        if non_mushroom_count > len(non_mushroom_dishes):
            continue
        
        # 计算当前组合的价格
        price = sum(mushroom_dishes[:mushroom_count]) + sum(non_mushroom_dishes[:non_mushroom_count])
        min_price = min(min_price, price)
    
    # 如果无法满足要求,返回 -1
    return min_price if min_price != float('inf') else -1

代码解析

  1. 数据分类

    • 使用两组列表 mushroom_dishesnon_mushroom_dishes 来分别存储含蘑菇和不含蘑菇的菜品价格。
    • 根据字符串 s 中每个位置的值决定该菜品是否含蘑菇,进行分类。
  2. 排序

    • 对这两组菜品的价格进行升序排序。这样我们可以优先选择价格较低的菜品,以达到最小总价格的目标。
  3. 组合选择

    • 对于每一种可能的蘑菇菜品数量 mushroom_count(从 0 到 min(k, len(mushroom_dishes))),计算对应的 non_mushroom_count,并计算该组合的总价格。
    • 检查 mushroom_count 是否小于等于 m,并且 non_mushroom_count 是否不超过没有蘑菇的菜品数量。如果符合条件,则计算价格并更新最小价格。
  4. 返回结果

    • 如果找到了有效的组合,则返回最小的总价格。如果没有找到有效组合,则返回 -1