刷题打卡【菜品选择】| 豆包MarsCode AI刷题

99 阅读4分钟

解题思路报告

题目描述

小C来到了一个饭馆,这里有 n 道菜。每道菜有其对应的价格以及是否含有蘑菇的信息。我们的目标是帮助小C在满足以下条件的情况下,选出 k 道价格最低的菜:

  1. 最多选择 m 道含有蘑菇的菜;
  2. 如果无法选择出 k 道菜,则输出 -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

解题思路

为了解决该问题,我们需要通过合理的选择和排序来确保:

  • 在选择 k 道菜时,所选菜品的总价格尽量低;
  • 限制最多只能选择 m 道含有蘑菇的菜。

在实现过程中,我们可以按照以下步骤来设计算法:

  1. 数据结构选择

    • 使用一个元组来存储每道菜的信息,其中每个元组包含两个值:菜的价格以及该菜是否含有蘑菇(用 0 表示没有蘑菇,1 表示有蘑菇)。这样可以方便地对菜品进行排序。
  2. 排序操作

    • 为了保证选出的菜品价格尽可能低,我们将菜品按价格从低到高排序。
  3. 选择菜品

    • 从排序后的菜品中开始选择。首先选择没有蘑菇的菜,然后在需要的情况下选择含有蘑菇的菜,但必须确保蘑菇菜品的数量不超过 m。
  4. 检查可行性

    • 在选择过程中,若发现没有足够的菜品满足条件(例如剩余的菜品无法满足所选菜品数量或蘑菇数量超过限制),则输出 -1。
  5. 计算总价格

    • 如果成功选择了 k 道菜,计算它们的总价格并输出。

具体过程

  1. 输入转换

    • 将每道菜的价格和是否含有蘑菇的标志合并成一个元组列表,形成 (价格, 是否含蘑菇) 的形式。
  2. 排序

    • 对菜品列表按照价格进行升序排序。
  3. 菜品选择

    • 遍历排序后的列表,选择菜品并根据蘑菇数量限制进行判断:
      • 如果菜品不含蘑菇,直接选择;
      • 如果菜品含有蘑菇,只有在蘑菇菜品数量没有超过 m 时才能选择。
  4. 结束条件

    • 一旦选择了 k 道菜,计算并返回总价格。如果无法选择到 k 道菜,返回 -1。

代码片段解析

def solution(s: str, a: list, m: int, k: int) -> int:
    # 创建菜品列表,每个元素为(价格, 是否含蘑菇)
    dishes = [(a[i], int(s[i])) for i in range(len(a))]
    
    # 按照价格从低到高排序
    dishes.sort()

    total_price = 0  # 总价格
    mushroom_count = 0  # 含蘑菇的菜品数量
    selected_count = 0  # 已选择的菜品数量

    # 遍历菜品列表,选择价格最小的k道菜
    for price, has_mushroom in dishes:
        if selected_count == k:  # 已选择k道菜,停止
            break
        if has_mushroom == 1 and mushroom_count < m:  # 如果菜含有蘑菇且蘑菇数量未超过限制
            total_price += price
            mushroom_count += 1
            selected_count += 1
        elif has_mushroom == 0:  # 如果菜不含蘑菇,直接选择
            total_price += price
            selected_count += 1

    # 如果未选择到k道菜,则返回-1
    if selected_count < k:
        return -1

    return total_price

MarshCodeAI帮了我什么

  1. 明确解题思路: MarshCodeAI通过分析题目给出了清晰的解题框架:首先将每道菜的信息存储在一个元组中,然后进行排序和选择。这个思路在编码时非常有帮助,避免了冗余的判断和计算。

  2. 代码结构建议: MarshCodeAI建议使用元组存储菜品的价格和是否含蘑菇的信息,这种方式便于管理和处理数据,也使得排序操作更加简洁。

  3. 边界条件处理: MarshCodeAI帮助我思考了如何处理边界情况,例如蘑菇菜品的数量超过限制,或者无法选择到 k 道菜时如何返回 -1。

总结

本题的核心在于合理选择菜品,同时要满足蘑菇数量的限制。通过将菜品按价格排序并逐一选择,结合蘑菇数量限制来优化选择策略,最终求得总价格或判断是否无法满足条件。通过 MarshCodeAI的帮助,思路更加清晰,代码结构更简洁,边界条件处理也更加完善。