题目解析
在豆包MarsCode AI刷题题库中,我选择了一道关于菜品选择的题目。题目要求在给定的菜品中选择一定数量的菜品,使得总价格最低,同时限制含有蘑菇的菜品数量。具体来说,题目给出了菜品的价格数组 a 和是否含有蘑菇的字符串 s,以及两个整数 m 和 k,分别表示最多允许含有蘑菇的菜品数量和需要选择的菜品总数。
思路解析:
- 理解题目:我们需要在满足最多含有
m道蘑菇菜品的前提下,选择k道菜,使得总价格最小。 - 数据结构选择:我们可以将菜品按价格排序,这样可以从价格最低的菜品开始选择,以保证总价格最小。
- 算法步骤:
- 将菜品按价格排序,并记录是否含有蘑菇。
- 尝试选择含有蘑菇的菜品数量从
0到m。 - 对于每种蘑菇菜品的选择数量,选择价格最低的菜品,直到选满
k道菜。 - 计算每种选择情况下的总价格,并记录最小值。
- 如果无法满足条件,返回
-1。
图解: 假设我们有以下输入:
s = "001"a = [10, 20, 30]m = 1k = 2
排序后的菜品为 [(10, '0'), (20, '0'), (30, '1')]。我们尝试选择 0 到 1 道蘑菇菜品:
- 选择
0道蘑菇菜品:选择(10, '0')和(20, '0'),总价格为30。 - 选择
1道蘑菇菜品:选择(10, '0')和(30, '1'),总价格为40。
最小总价格为 30。
代码详解:
def solution(s: str, a: list, m: int, k: int) -> int:
dishes = sorted(zip(a, s)) # 将菜品按价格排序
min_total_price = float('inf') # 初始化最小总价格为无穷大
for mushrooms in range(m + 1): # 尝试选择含有蘑菇的菜品数量从0到m
selected_dishes = []
for price, has_mushroom in dishes:
if has_mushroom == '1' and mushrooms > 0:
selected_dishes.append(price)
mushrooms -= 1
elif has_mushroom == '0':
selected_dishes.append(price)
if len(selected_dishes) >= k: # 如果选中的菜品数量等于k,计算总价格
min_total_price = min(min_total_price, sum(selected_dishes[:k]))
return -1 if min_total_price == float('inf') else min_total_price # 如果无法选择满足条件的菜品,返回-1
知识总结
在使用豆包MarsCode AI刷题的过程中,我学到了以下新知识点:
- 排序与贪心算法:通过排序可以简化问题的复杂度,贪心算法可以在每一步选择最优解,从而达到全局最优。
- 组合选择问题:这类问题通常需要考虑多种组合情况,通过枚举和剪枝可以有效减少计算量。
- Python的zip函数:
zip函数可以将多个列表合并为一个元组列表,便于同时处理多个列表的数据。
学习建议:
- 理解题目:在刷题前,务必仔细阅读题目描述,理解题目要求和限制条件。
- 多练习:通过多次练习,熟悉不同类型的题目和解题思路。
- 总结反思:每次刷题后,总结解题思路和遇到的困难,形成自己的知识体系。
学习计划
高效学习方法:
- 制定刷题计划:根据自身情况,制定每日或每周的刷题计划,逐步提高难度。
- 利用错题进行针对性学习:将错题记录下来,分析错误原因,并进行针对性练习。
- 定期复习:定期回顾已解决的题目,巩固知识点。
工具运用:
- 结合AI刷题功能:利用豆包MarsCode AI的智能提示和解析功能,快速理解题目和解题思路。
- 结合其他学习资源:如LeetCode、牛客网等,多渠道获取题目和解题思路。
- 参与讨论:加入刷题群或论坛,与其他学习者交流,分享解题思路和经验。
通过以上方法,可以有效提高刷题效率,巩固编程基础,提升解题能力。