问题描述
小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i = '1',那么第 ii 道菜含有蘑菇,否则没有。
小C希望点 kk 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 mm 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1。
问题理解
-
输入:
s: 一个字符串,表示每道菜是否含有蘑菇。'1'表示含有蘑菇,'0'表示没有。a: 一个列表,表示每道菜的价格。m: 一个整数,表示小C最多能接受的含有蘑菇的菜的数量。k: 一个整数,表示小C希望点的菜的总数。
-
输出:
- 一个整数,表示在满足条件的情况下能选出的最小总价格。如果无法按照要求选择菜品,则输出
-1。
- 一个整数,表示在满足条件的情况下能选出的最小总价格。如果无法按照要求选择菜品,则输出
解题思路
-
数据结构选择:
- 我们可以将每道菜的信息(价格和是否含有蘑菇)存储在一个列表中,每个元素是一个元组
(price, has_mushroom)。 - 例如,对于输入
s = "001", a = [10, 20, 30],我们可以生成列表[(10, 0), (20, 0), (30, 1)]。
- 我们可以将每道菜的信息(价格和是否含有蘑菇)存储在一个列表中,每个元素是一个元组
-
算法步骤:
- 排序: 首先,我们可以根据价格对所有菜品进行排序,这样可以优先选择价格较低的菜品。
- 选择菜品: 从排序后的列表中,尝试选择
k道菜,并确保含有蘑菇的菜品数量不超过m。 - 检查条件: 如果在选择过程中发现无法满足条件(即含有蘑菇的菜品数量超过
m),则返回-1。 - 计算总价格: 如果成功选择了
k道菜,则计算这些菜品的价格总和并返回
def solution(s: str, a: list, m: int, k: int) -> int: # 将菜品信息存储在列表中 dishes = [(a[i], int(s[i])) for i in range(len(s))]
# 按价格排序
dishes.sort()
# 初始化变量
total_price = 0
mushroom_count = 0
# 选择菜品
for price, has_mushroom in dishes:
if k == 0:
break
if has_mushroom == 1 and mushroom_count < m:
# 选择含有蘑菇的菜品
total_price += price
mushroom_count += 1
k -= 1
elif has_mushroom == 0:
# 选择不含蘑菇的菜品
total_price += price
k -= 1
# 检查是否满足条件
if k == 0:
return total_price
else:
return -1
关键步骤
- 排序: 确保我们优先选择价格较低的菜品。
- 选择菜品: 在选择菜品时,优先选择不含蘑菇的菜品,只有在必要时才选择含有蘑菇的菜品。
- 检查条件: 在选择过程中,确保含有蘑菇的菜品数量不超过
m