问题
小C来到了一家饭馆,这里共有 n 道菜,第 i 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 i 道菜是否含有蘑菇。如果 s_i = '1',那么第 i 道菜含有蘑菇,否则没有。
小C希望点 k 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 m 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1。
为了解决这个问题,我们需要做以下几个步骤:
-
分离蘑菇菜品与非蘑菇菜品: 根据给定的
s字符串,我们需要将菜品分为含有蘑菇的菜品和不含蘑菇的菜品。然后分别对它们的价格进行排序,以便能够选出最便宜的菜品。 -
判断能否选出满足条件的菜品:
- 我们要选出
k道菜,并且最多选m道含有蘑菇的菜品。 - 如果要选的菜品数大于菜品总数或要求的蘑菇数超出了范围,则直接返回
-1。
- 我们要选出
-
选择菜品的策略:
- 首先选择最便宜的
k道菜。 - 如果可能选择含蘑菇的菜品,则要注意控制蘑菇的数量不能超过
m。
- 首先选择最便宜的
-
实现步骤:
- 分别将含有蘑菇的菜和不含蘑菇的菜按价格排序。
- 根据选择的规则计算最小的总价格。
完整代码实现:
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
解释:
-
菜品分类:
- 我们根据字符串
s将菜品分为两类:mushroom_dishes(含有蘑菇的菜品)和no_mushroom_dishes(不含蘑菇的菜品)。然后分别把菜品价格a[i]加入相应的列表。
- 我们根据字符串
-
判断是否能够满足条件:
- 如果总的菜品数不足
k,或者蘑菇菜品数超出了m,我们直接返回-1。 - 如果含蘑菇的菜品不足
mushroom_count(即最大允许的蘑菇菜品数),或者不含蘑菇的菜品不足no_mushroom_count(即需要的非蘑菇菜品数),也返回-1。
- 如果总的菜品数不足
-
选择最便宜的菜品:
- 对于含蘑菇的菜品,我们选择最便宜的
mushroom_count道菜。 - 对于不含蘑菇的菜品,我们选择最便宜的
no_mushroom_count道菜。 - 最终的结果是这些菜品价格的和。
- 对于含蘑菇的菜品,我们选择最便宜的
测试结果:
- 输入
s = "001", a = [10, 20, 30], m = 1, k = 2,输出:30。 - 输入
s = "111", a = [10, 20, 30], m = 1, k = 2,输出:-1。 - 输入
s = "0101", a = [5, 15, 10, 20], m = 2, k = 3,输出:30。
通过这些测试案例,我们能够确保该程序在不同场景下都能正确工作。