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

114 阅读3分钟

问题描述 小C来到了一家饭馆,这里共有 n 道菜,第 i 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 i 道菜是否含有蘑菇。如果 s_i = '1',那么第 i 道菜含有蘑菇,否则没有。小C希望点 k 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 m 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1。 利用豆包MarsCode AI为我提供了解题思路:

问题理解 输入: s:一个字符串,表示每道菜是否含有蘑菇。 a:一个列表,表示每道菜的价格。 m:一个整数,表示最多可以选含有蘑菇的菜的数量。 k:一个整数,表示总共需要选的菜的数量。 输出: 在满足条件的情况下,选出的 k 道菜的最小总价格。如果无法满足条件,则输出 -1。 数据结构选择 分类: 将菜分为两类:含有蘑菇的菜和不含蘑菇的菜。 使用两个列表分别存储含有蘑菇的菜的价格和不含蘑菇的菜的价格。 排序: 对这两类菜的价格进行排序,以便后续选择价格最低的菜。 算法步骤 初始化: 将菜分为含有蘑菇和不含蘑菇两类,并分别存储在两个列表中。 对这两个列表按价格进行排序。 边界检查: 如果总的菜数不足 k 道,则直接返回 -1。 选择菜品: 尝试在不同的蘑菇数量(从 0 到 min(m, k))下选择菜品。 对于每种蘑菇数量,计算对应的非蘑菇菜的数量。 检查是否可以满足条件(即蘑菇菜和非蘑菇菜的数量是否足够)。 如果满足条件,计算当前选择下的总价格,并更新最小总价格。 返回结果: 如果找到了满足条件的最小总价格,则返回该价格;否则返回 -1

根据思路解析,编写了如下代码: `def solution(s: str, a: list, m: int, k: int) -> int: # 将菜分为含有蘑菇和不含蘑菇两类 mushroom = [] no_mushroom = []

for i in range(len(s)):
    if s[i] == '1':  # 含有蘑菇
        mushroom.append(a[i])
    else:  # 不含蘑菇
        no_mushroom.append(a[i])

# 对两类菜按价格排序(从低到高)
mushroom.sort()
no_mushroom.sort()

# 如果总菜数不足 k 道菜,则无法满足条件
if len(mushroom) + len(no_mushroom) < k:
    return -1

# 尝试在不同的蘑菇数量(0 到 min(m, k))下选择菜品
min_cost = float('inf')
for mushrooms_count in range(min(m, k) + 1):
    if mushrooms_count > len(mushroom):
        continue
    non_mushrooms_count = k - mushrooms_count
    if non_mushrooms_count > len(no_mushroom):
        continue
    
    # 选择前 mushrooms_count 道含有蘑菇的菜和前 non_mushrooms_count 道不含蘑菇的菜
    cost = sum(mushroom[:mushrooms_count]) + sum(no_mushroom[:non_mushrooms_count])
    min_cost = min(min_cost, cost)

return min_cost if min_cost != float('inf') else -1

测试用例

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 ` 我还想优化算法的时间复杂度,利用豆包MarsCode AI为我提供了优化思路:

  1. 排序优化 当前代码中,我们对含有蘑菇和不含蘑菇的菜分别进行了排序。排序的时间复杂度是 O(n log n),其中 n 是菜的数量。虽然排序是必要的,但我们可以通过减少排序的次数来优化。
  2. 选择菜品的过程优化 在当前代码中,我们通过遍历不同的蘑菇数量来选择菜品,这会导致多次重复计算。我们可以通过动态规划或双指针的方法来优化这个过程。