中等难度题:饭馆菜品选择问题
题目链接www.marscode.cn/practice...
题目描述
小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i = '1',那么第 ii 道菜含有蘑菇,否则没有。
小C希望点 kk 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 mm 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1。
样例1:
输入:
s = "001", a = [10, 20, 30], m = 1, k = 2
输出:30
样例2:
输入:
s = "111", a = [10, 20, 30], m = 1, k = 2
输出:-1
样例3:
输入:
s = "0101", a = [5, 15, 10, 20], m = 2, k = 3
输出:30
题意分析
输入
s: 一个字符串,表示每道菜是否含有蘑菇。'1'表示含有蘑菇,'0'表示没有。a: 一个列表,表示每道菜的价格。m: 一个整数,表示最多可以选含有蘑菇的菜的数量。k: 一个整数,表示总共需要选的菜的数量。
输出
- 一个整数,表示在满足条件的情况下能选出的最小总价格。如果无法满足条件,则输出
-1。
思路分析
- 我们可以将每道菜的信息(价格和是否含有蘑菇)存储在一个列表中,每个元素是一个元组
(price, has_mushroom)。 - 排序: 首先,我们可以根据价格对所有菜进行排序,这样可以优先选择价格较低的菜。
- 选择菜: 从排序后的列表中,尝试选择
k道菜,同时确保含有蘑菇的菜不超过m道。 - 检查条件: 如果在选择过程中发现无法满足条件(即含有蘑菇的菜超过了
m道),则返回-1。 - 计算总价格: 如果成功选择了
k道菜,则计算这些菜的总价格并返回。
具体代码步骤
def solution(s: str, a: list, m: int, k: int) -> int:
# write code here
d = [(a[i], int(s[i])) for i in range(len(a))]
d.sort()
price = 0
count = 0
for price_i, has_i in d:
if k == 0:
break
if has_i == 1 and count < m:
price += price_i
count += 1
k -= 1
elif has_i == 0:
price += price_i
k -= 1
if k > 0:
return -1
print(d)
return 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)
关键步骤
- 构建菜的列表: 将价格和是否含有蘑菇的信息组合在一起。
- 排序: 按价格从小到大排序。
- 选择菜: 优先选择价格低的菜,同时控制含有蘑菇的菜的数量。
- 检查条件: 如果无法选择足够的菜,返回
-1。
知识总结
- 数据结构的选择与使用
- 排序算法
- 条件判断与循环
- 计数器的使用
- 边界条件的处理
- 函数的定义与调用
- 列表推导式的使用