青训营X豆包MarsCode技术训练营 | 豆包MarsCode AI刷题:饭馆菜品选择问题

99 阅读4分钟

问题描述

小C在一家饭馆面临一个选择难题:面对n道菜,每道菜有其价格a_i,部分菜品含有蘑菇,用s_i表示第i道菜是否含有蘑菇('1'表示含蘑菇,否则不含)。小C希望在点k道菜的前提下,使得总价格最低,同时含有蘑菇的菜品不超过m道。若无法满足条件,请返回-1。

学习方法与心得

在编程学习之旅中,解决算法题是提升技能的关键。无论是巩固基础,备战面试,还是增强编程能力,刷题都是实现目标的重要途径。通过在算法练习平台上的刷题实践,我不仅解决了众多算法问题,还深化了对学习方法、时间管理和问题分析的理解。

题目解析

本题是一个典型的贪心算法问题,要求我们计算出在给定条件下,小C在饭馆点菜的最小总价格。关键信息包括菜品价格数组a和含有蘑菇的标识数组s,以及整数k和m。解题思路如下:

思路解析

  1. 将不含蘑菇和含蘑菇的菜品分别放入两个列表中。
  2. 对两个列表进行排序,从小到大。
  3. 如果不含蘑菇的菜品数量小于k-m,那么无法满足条件,返回-1。
  4. 尝试所有可能的组合,计算每种组合的总价格,并更新最小价格。
  5. 如果最小价格仍然是无穷大,说明无法满足条件,返回-1。

数学推导

本题的解决方案主要依赖于贪心算法的模拟,不需要复杂的数学推导。但我们可以理解为,我们需要找到最小的x使得x * b >= a,这里的a是k,b是每次选择的增量(在这个问题中,b总是1,因为我们每次只选择一次)。

代码实现

根据上述思路,我们可以很容易地实现该算法。下面是代码的具体实现:

def solution(s, a, m, k):
    no_mushroom = [price for price, has_mushroom in zip(a, s) if has_mushroom == '0']
    with_mushroom = [price for price, has_mushroom in zip(a, s) if has_mushroom == '1']
    
    no_mushroom.sort()
    with_mushroom.sort()
    
    if len(no_mushroom) < k - m:
        return -1
    
    min_price = float('inf')
    
    for i in range(min(m + 1, len(with_mushroom) + 1)):
        mushroom_price = sum(with_mushroom[:i])
        non_mushroom_price = sum(no_mushroom[:k - i])
        if len(no_mushroom) >= k - i:
            min_price = min(min_price, mushroom_price + non_mushroom_price)
    
    if min_price == float('inf'):
        return -1
    else:
        return min_price

# 测试样例
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

图片.png 知识总结

在刷题的过程中,我总结了几个重要的学习点:

  • 问题分解与数学推导:通过对题目的仔细分析,我们可以将一个看似复杂的问题转化为一个简单的数学问题。
  • 高效的计算方法:在编程中,了解如何通过数学公式来优化解决方案非常重要。
  • 代码的简洁性:好的代码应该具备简洁和易懂的特点。
  • 调试与测试:对于每道题目,在完成代码编写后,我都会进行多次测试,确保代码的正确性和健壮性。

学习计划与高效学习方法

通过在算法练习平台上刷题,我逐渐形成了自己的学习计划和方法:

  • 制定合理的刷题计划,从简单到复杂,循序渐进地掌握不同类型的算法。
  • 坚持每天刷题,积累经验,增强编程能力和问题分析能力。
  • 利用错题进行复习,分析错误原因,避免相同的错误。
  • 做题后总结,加深对知识点的理解,为未来遇到类似问题时迅速找到解决方法。
  • 多样化学习资源结合,参考算法书籍、观看视频教程、参与在线讨论等。

工具运用与实践建议

豆包MarsCode AI的刷题功能为我提供了一个高效的学习平台。以下是我将AI刷题功能与其他学习资源相结合的几种方式:

  • 利用AI做实时反馈,快速给出解题提示,评估代码。
  • 利用题库进行针对性学习,筛选题目,专注薄弱领域。
  • 分析错题集,根据错题分析不足,逐步提高。
  • 与他人交流与讨论,分享解法,从他人解法中得到启发。

总结

通过刷题,我不仅掌握了编程技能,还提高了解题的思维方式。AI刷题功能为我提供了精准的反馈和丰富的题库,结合合理的学习计划和复习策略,我相信自己能够不断提升编程能力,为未来的挑战做好充分准备。对于其他同学,我建议坚持刷题、总结经验,尤其要重视错题的分析与复习,这将是提高编程水平的关键步骤。如果有任何建议或需要进一步的帮助,请随时告诉我!