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

66 阅读3分钟

36.饭馆菜品选择问题

  • 问题描述

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

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

  • 思路解析

    1. 需要从 n 道菜中选择 k 道菜,使得总价格最小,并且最多有 m 道菜含有蘑菇。
  • 数据结构选择

    1. 分类菜品: 将菜品按是否含有蘑菇分类,分别存储在两个列表中:with_mushroom 和 without_mushroom
    2. 排序: 对这两个列表按价格进行排序,这样可以更容易地选择价格最低的菜品。
  • 算法步骤

    1. 初始化: 初始化一个变量 min_total_price 为无穷大,用于记录最小总价格。
    2. 组合选择
      • 使用双指针或组合的方式,从两个列表中选择满足条件的菜品组合,确保总价格最小。
      • 具体来说,你可以尝试不同的组合,确保含有蘑菇的菜品数量不超过 m
  • 边界条件

    • 如果无法满足条件(例如,含有蘑菇的菜品数量不足 m),则返回 -1
  • 具体步骤

  1. 遍历含有蘑菇的菜品数量
  • 从 0 到 m 遍历含有蘑菇的菜品数量 i
  • 对于每个 i,从 with_mushroom 中选择 i 道菜,从 without_mushroom 中选择 k - i 道菜。
  1. 计算总价格

    • 计算每种组合的总价格,并更新 min_total_price
  2. 返回结果

    • 如果 min_total_price 仍然是初始值(无穷大),则返回 -1,否则返回 min_total_price
  • 难点总结

    1. 如何高效地选择组合

    • 需要考虑如何在两个列表中选择菜品,使得总价格最小,并且含有蘑菇的菜品数量不超过 m
    • 可以使用双指针或组合的方式,但需要确保算法的效率。
    1. 如何处理边界条件

    • 需要确保在无法满足条件时返回 -1

    • 需要处理各种边界情况,例如含有蘑菇的菜品数量不足 m 的情况。

    1. 如何优化计算

    • 需要避免不必要的计算,确保算法在合理的时间内运行。
  • 代码部分

def solution(s: str, a: list, m: int, k: int) -> int:
    # 将菜品按是否含有蘑菇分类
    with_mushroom = []
    without_mushroom = []
    for i in range(len(s)):
        if s[i] == '1':
            with_mushroom.append(a[i])
        else:
            without_mushroom.append(a[i])
    
    # 对两个列表按价格排序
    with_mushroom.sort()
    without_mushroom.sort()
    
    # 初始化最小总价格为无穷大
    min_total_price = float('inf')
    
    # 尝试不同的组合,确保含有蘑菇的菜品数量不超过 m
    # 这里需要实现具体的组合逻辑
    # 例如,使用双指针或组合的方式
    
    # 如果无法找到满足条件的组合,返回 -1
    if min_total_price == float('inf'):
        return -1
    
    return min_total_price

if __name__ == '__main__':
    print(solution("001", [10, 20, 30], 1, 2) == 30)
    print(solution("111", [10, 20, 30], 1, 2) == -1)
    print(solution("0101", [5, 15, 10, 20], 2, 3) == 30)