在这道题中,给定了饭馆中的菜品信息,包括每道菜的价格和是否含有蘑菇。小C希望在满足一定条件的情况下,选出一些菜品。我们需要帮助她找出在这些条件下,所选菜品的最小总价格。具体问题如下:
-
输入:
s:一个字符串,表示每道菜是否含有蘑菇,s[i] = '1'表示第i道菜含有蘑菇,s[i] = '0'表示第i道菜没有蘑菇。a:一个整数列表,表示每道菜的价格。m:表示小C最多可以选择的蘑菇菜品数。k:表示小C需要选择的菜品总数。
-
目标:选择恰好
k道菜,使得它们的总价格尽可能低,并且其中含有蘑菇的菜品最多为m道。如果无法选择满足条件的菜品,返回-1。
思路与解法
-
划分菜品类别:
- 首先,我们需要将菜品按是否含有蘑菇进行划分,分为两类:一类是含有蘑菇的菜品,另一类是没有蘑菇的菜品。对于这两类菜品,我们分别提取出它们的价格,并进行排序。这样我们可以通过从价格较低的菜品开始选择,从而得到最小的总价格。
-
计算可能的选择方案:
- 我们需要从两类菜品中选出总共
k道菜。具体地,我们选择从含有蘑菇的菜品中选择mushroom_count道菜,从没有蘑菇的菜品中选择non_mushroom_count = k - mushroom_count道菜。为了确保选择的菜品总数为k,我们需要保证mushroom_count <= m(即最多m道含蘑菇的菜品)且non_mushroom_count不超过没有蘑菇的菜品数。
- 我们需要从两类菜品中选出总共
-
边界条件和约束:
- 如果含有蘑菇的菜品数超过
m,则该方案不可行。 - 如果选择的菜品数大于菜品的总数,则也是不合法的。
- 如果不能满足选出
k道菜的条件,返回-1。
- 如果含有蘑菇的菜品数超过
-
求解最小总价格:
- 对每种可能的
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
代码解析
-
数据分类:
- 使用两组列表
mushroom_dishes和non_mushroom_dishes来分别存储含蘑菇和不含蘑菇的菜品价格。 - 根据字符串
s中每个位置的值决定该菜品是否含蘑菇,进行分类。
- 使用两组列表
-
排序:
- 对这两组菜品的价格进行升序排序。这样我们可以优先选择价格较低的菜品,以达到最小总价格的目标。
-
组合选择:
- 对于每一种可能的蘑菇菜品数量
mushroom_count(从 0 到min(k, len(mushroom_dishes))),计算对应的non_mushroom_count,并计算该组合的总价格。 - 检查
mushroom_count是否小于等于m,并且non_mushroom_count是否不超过没有蘑菇的菜品数量。如果符合条件,则计算价格并更新最小价格。
- 对于每一种可能的蘑菇菜品数量
-
返回结果:
- 如果找到了有效的组合,则返回最小的总价格。如果没有找到有效组合,则返回
-1。
- 如果找到了有效的组合,则返回最小的总价格。如果没有找到有效组合,则返回