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

96 阅读3分钟

中等难度题:饭馆菜品选择问题

题目链接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. 构建菜的列表: 将价格和是否含有蘑菇的信息组合在一起。
  2. 排序: 按价格从小到大排序。
  3. 选择菜: 优先选择价格低的菜,同时控制含有蘑菇的菜的数量。
  4. 检查条件: 如果无法选择足够的菜,返回 -1

知识总结

  • 数据结构的选择与使用
  • 排序算法
  • 条件判断与循环
  • 计数器的使用
  • 边界条件的处理
  • 函数的定义与调用
  • 列表推导式的使用