小S的菜式制作 | 豆包MarsCode AI 刷题
问题描述
小S准备做一道菜。为了做这道菜,小S需要 2 个材料a和 2 个材料b。现在小S有 a 个材料a,b 个个材料b,以及 c 个万能个材料(每个万能食材可以替代一个材料a或者一个材料b)。小S想知道,自己最多可以制作多少次这道菜。
测试样例
样例1:
输入:
a = 3,b = 3,c = 3输出:2
样例2:
输入:
a = 5,b = 3,c = 2输出:2
样例3:
输入:
a = 10,b = 5,c = 7输出:5
样例4:
输入:
a = 8,b = 2,c = 4输出:3
解题思路
- 计算初始可制作的次数:首先计算不使用万能材料的情况下,最多可以制作多少次。即
min(a // 2, b // 2)。 - 计算剩余材料:计算使用上述次数后,剩余的材料a和材料b的数量。
- 使用万能材料:计算剩余的材料a和材料b的差值,并使用万能材料来填补这个差值。
- 计算最终可制作的次数:结合初始可制作的次数和使用万能材料后可增加的次数,得到最终结果。
代码详解
1.计算初始可制作的次数
首先计算下不使用万能材料的情况下,最多可以制作多少次。
initial_count = min(a // 2, b // 2)
2.计算剩余材料:
计算使用上诉次数后,剩余的材料a和材料b的数量
remaining_a = a - initial_count * 2
remaining_b = b - initial_count * 2
3.使用万能材料
计算剩余的材料a和材料b的差值,并使用万能材料来填补这个差值。
如果差价小于等于万能材料,直接相加//4
如果差价大于万能材料,就需要考虑是材料a和材料b材料哪个小,哪个材料少就把万能材料给哪个材料,再统计可以制作多少次。
# 计算需要填补的差值
diff = abs(remaining_a - remaining_b)
# 使用万能材料填补差值
if c >= diff:
# 计算使用万能材料后可增加的次数
additional_count = (remaining_a + remaining_b + c) // 4
else:
if remaining_a<remaining_b:
remaining_a+=c
additional_count=min(remaining_a // 2, remaining_b // 2)
else:
remaining_b+=c
additional_count=min(remaining_a // 2, remaining_b // 2)
4.最大化使用万能材料
结合初始可制作的次数和使用万能材料后可增加的次数,得到最终结果。
initial_count + additional_count
详细步骤
-
初始可制作的次数:
-
计算
initial_count = min(a // 2, b // 2)。 -
这是在不使用万能材料的情况下,最多可以制作的次数。
-
-
计算剩余材料:
-
计算
remaining_a = a - initial_count * 2和remaining_b = b - initial_count * 2。 -
这是使用初始次数后,剩余的材料a和材料b的数量。
-
-
填补差值:
-
计算
diff = abs(remaining_a - remaining_b)。 -
这是剩余材料a和材料b的差值。
-
-
使用万能材料填补差值:
- 如果
c >= diff,则使用万能材料填补差值。 - 如果
c < diff,则使用万能材料全部填补到最少的材料上 - 最大化使用万能材料:
additional_count = (remaining_a + remaining_b + c) // 4在填补差值后,剩余的万能材料可以用来进一步增加制作次数。
- 如果
知识总结:
- 数学运算
- 整数除法:使用
//进行整数除法,例如a // 2表示将a除以 2 并取整数部分。 - 取最小值:使用
min()函数来获取两个数中的最小值,例如min(a // 2, b // 2)。 - 取绝对值:使用
abs()函数来获取一个数的绝对值,例如abs(remaining_a - remaining_b)。
- 贪心算法
- 贪心策略:在每一步选择中都采取在当前状态下最优的选择,以期望最终结果是最优的。在这个问题中,我们首先计算不使用万能材料的情况下最多可以制作的次数,然后使用万能材料来填补差值,以最大化制作次数。
- 条件判断
- 条件语句:使用
if语句来进行条件判断,例如if c >= diff,判断万能材料是否足够填补差值。 - 多重条件:在某些情况下,可能需要使用
else或elif来处理不同的条件分支。
- 变量更新
- 变量赋值:在计算过程中,需要不断更新变量的值,例如
remaining_a = a - initial_count * 2。 - 变量累加:在计算最终结果时,可能需要将多个变量的值累加起来,例如
total_count = initial_count + additional_count。
- 代码结构
- 函数定义:使用
def关键字定义函数,例如def solution(a: int, b: int, c: int) -> int。 - 返回值:使用
return语句返回函数的计算结果,例如return initial_count + additional_count。
学习计划:
1.定期刷题:每天至少一道算法题,思考如何在第一步的基础上,如何优化算法,降低时间复杂度。
2.错题总结:总结一下这道题考察的知识点、切入的角度、同类型的题目等,还要思考有没有更优的办法,代码还能不能更加简洁一些。
工具运用:
豆包MarsCode AI提供了详细的解题思路和代码示例。
向豆包提出问题,可以获得思路启发,便于我们更好的理解和把握如何运用算法去解题。
针对代码中可能出现的语法错误,逻辑漏洞等问题,可以帮忙检查出并给出修改建议,提升代码的准确率和效率
在解完算法题后,可以帮你回顾题目中涉及到的算法知识,数据结构知识等,强化你对这些知识点的掌握程度。并且为你拓展相关的,更深入或者更广泛的算法知识内容,拓展知识面,更好的应对更多类型的算法题。
完整代码实现
def solution(a: int, b: int, c: int) -> int:
# 计算初始可制作的次数
initial_count = min(a // 2, b // 2)
# 计算剩余材料
remaining_a = a - initial_count * 2
remaining_b = b - initial_count * 2
# 计算需要填补的差值
diff = abs(remaining_a - remaining_b)
# 使用万能材料填补差值
if c >= diff:
# 计算使用万能材料后可增加的次数
additional_count = (remaining_a + remaining_b + c) // 4
else:
if remaining_a<remaining_b:
remaining_a+=c
additional_count=min(remaining_a // 2, remaining_b // 2)
else:
remaining_b+=c
additional_count=min(remaining_a // 2, remaining_b // 2)
# 最终可制作的次数
return initial_count + additional_count
if __name__ == '__main__':
print(solution(3, 3, 3) == 2)
print(solution(5, 3, 2) == 2)
print(solution(10, 5, 7) == 5)
print(solution(8, 2, 4) == 3)