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

47 阅读3分钟

问题描述

小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i = '1',那么第 ii 道菜含有蘑菇,否则没有。

小C希望点 kk 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有 mm 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1

这道题的关键就是在于对蘑菇价格的排序,但是这里还涉及到每道菜含有的毒性判断,所以直接对价格数组进行排序会显得比较困难因为无法知道如何进行菜品菜品价格对应的排序。可以将毒性和菜品价格进行字典组合,然后根据价格排序这样就不用考虑毒性判断;然后直接从小到大判断是否有毒,再根据有毒的菜品总数价格不超过m进行选择菜品即可。以下是具体代码:

    # 将字符串 s 转换为列表,并创建一个包含价格和是否含有蘑菇的元组列表
    dishes = [(a[i], s[i] == '1') for i in range(len(s))]
    dishes.sort(key=lambda x: x[0])
    
    mushroom_count, selected_dishes_count, total = 0, 0, 0
    i = 0
    
    while selected_dishes_count < k and i < len(dishes):
        if not dishes[i][1]:  # 如果这道菜不含蘑菇
            total += dishes[i][0]
            selected_dishes_count += 1
        elif mushroom_count < m:  # 如果这道菜含蘑菇且蘑菇数量未超过限制
            total += dishes[i][0]
            selected_dishes_count += 1
            mushroom_count += 1
        i += 1
    
    if selected_dishes_count < k:
        return -1
    
    return total

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)

以下是对代码的具体解释: 首先,我们把字符串s转换成列表,并和价格列表a结合起来,形成一个新列表dishes。这个列表里的每个元素都是一个包含价格和是否含蘑菇的元组。然后,我们按照价格对这个列表进行排序,这样我们就可以从小到大选择菜肴。

我们初始化了三个变量:mushroom_count用来记录我们选了多少含蘑菇的菜,selected_dishes_count用来记录总共选了多少道菜,total用来计算我们选择的菜的总价格。

接着,我们用一个循环来选择菜肴。在每次循环中,我们会检查当前的菜肴是否含蘑菇。如果不含蘑菇,我们就把它的价格加到总价格里,并增加已选择的菜肴数量。如果含蘑菇,但我们还可以选择更多的含蘑菇的菜肴(即mushroom_count小于m),我们也会把它的价格加到总价格里,并增加已选择的菜肴数量和含蘑菇的菜肴数量。

循环结束后,如果选择的菜肴数量没有达到k,那么我们无法满足条件,函数就会返回-1。如果成功选择了k道菜,函数就会返回我们计算出的总价格。