饭馆菜品选择问题 | 青训营X豆包MarsCode 技术训练营

86 阅读3分钟

问题

小C来到了一家饭馆,这里共有 n 道菜,第 i 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 i 道菜是否含有蘑菇。如果 s_i = '1',那么第 i 道菜含有蘑菇,否则没有。

小C希望点 k 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 m 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1

为了解决这个问题,我们需要做以下几个步骤:

  1. 分离蘑菇菜品与非蘑菇菜品: 根据给定的 s 字符串,我们需要将菜品分为含有蘑菇的菜品和不含蘑菇的菜品。然后分别对它们的价格进行排序,以便能够选出最便宜的菜品。

  2. 判断能否选出满足条件的菜品

    • 我们要选出 k 道菜,并且最多选 m 道含有蘑菇的菜品。
    • 如果要选的菜品数大于菜品总数或要求的蘑菇数超出了范围,则直接返回 -1
  3. 选择菜品的策略

    • 首先选择最便宜的 k 道菜。
    • 如果可能选择含蘑菇的菜品,则要注意控制蘑菇的数量不能超过 m
  4. 实现步骤

    • 分别将含有蘑菇的菜和不含蘑菇的菜按价格排序。
    • 根据选择的规则计算最小的总价格。

完整代码实现:

def solution(s: str, a: list, m: int, k: int) -> int:
    # 获取含蘑菇和不含蘑菇的菜品
    mushroom_dishes = []
    no_mushroom_dishes = []
    
    for i in range(len(s)):
        if s[i] == '1':
            mushroom_dishes.append(a[i])
        else:
            no_mushroom_dishes.append(a[i])
    
    # 如果蘑菇菜品数量超过 m,或者总的菜品数不足 k,道题无法满足
    if len(mushroom_dishes) > m and len(no_mushroom_dishes) + len(mushroom_dishes) < k:
        return -1
    
    # 排序:优先选最便宜的菜品
    mushroom_dishes.sort()
    no_mushroom_dishes.sort()
    
    # 如果选择了太多蘑菇菜,超过了 m,直接返回-1
    # 分别选择mushroom_dishes和no_mushroom_dishes
    mushroom_count = min(m, k)  # 最多选 m 道蘑菇菜
    no_mushroom_count = k - mushroom_count  # 剩下的要从非蘑菇菜选择

    # 如果蘑菇菜品数不足以满足mushroom_count要求,直接返回-1
    if len(mushroom_dishes) < mushroom_count or len(no_mushroom_dishes) < no_mushroom_count:
        return -1
    
    # 计算最小的价格
    total_price = sum(mushroom_dishes[:mushroom_count]) + sum(no_mushroom_dishes[:no_mushroom_count])
    return total_price


# 测试样例
if __name__ == '__main__':
    print(solution("001", [10, 20, 30], 1, 2) == 30)  # 输出: 30
    print(solution("111", [10, 20, 30], 1, 2) == -1)  # 输出: -1
    print(solution("0101", [5, 15, 10, 20], 2, 3) == 30)  # 输出: 30

解释:

  1. 菜品分类

    • 我们根据字符串 s 将菜品分为两类:mushroom_dishes(含有蘑菇的菜品)和 no_mushroom_dishes(不含蘑菇的菜品)。然后分别把菜品价格 a[i] 加入相应的列表。
  2. 判断是否能够满足条件

    • 如果总的菜品数不足 k,或者蘑菇菜品数超出了 m,我们直接返回 -1
    • 如果含蘑菇的菜品不足 mushroom_count(即最大允许的蘑菇菜品数),或者不含蘑菇的菜品不足 no_mushroom_count(即需要的非蘑菇菜品数),也返回 -1
  3. 选择最便宜的菜品

    • 对于含蘑菇的菜品,我们选择最便宜的 mushroom_count 道菜。
    • 对于不含蘑菇的菜品,我们选择最便宜的 no_mushroom_count 道菜。
    • 最终的结果是这些菜品价格的和。

测试结果:

  1. 输入 s = "001", a = [10, 20, 30], m = 1, k = 2,输出:30
  2. 输入 s = "111", a = [10, 20, 30], m = 1, k = 2,输出:-1
  3. 输入 s = "0101", a = [5, 15, 10, 20], m = 2, k = 3,输出:30

通过这些测试案例,我们能够确保该程序在不同场景下都能正确工作。