小S的菜式制作 | 豆包MarsCode AI 刷题

58 阅读6分钟

小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

解题思路


  1. 计算初始可制作的次数:首先计算不使用万能材料的情况下,最多可以制作多少次。即 min(a // 2, b // 2)
  2. 计算剩余材料:计算使用上述次数后,剩余的材料a和材料b的数量。
  3. 使用万能材料:计算剩余的材料a和材料b的差值,并使用万能材料来填补这个差值。
  4. 计算最终可制作的次数:结合初始可制作的次数和使用万能材料后可增加的次数,得到最终结果。

代码详解


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

详细步骤

  1. 初始可制作的次数

    • 计算 initial_count = min(a // 2, b // 2)

    • 这是在不使用万能材料的情况下,最多可以制作的次数。

  2. 计算剩余材料

    • 计算 remaining_a = a - initial_count * 2remaining_b = b - initial_count * 2

    • 这是使用初始次数后,剩余的材料a和材料b的数量。

  3. 填补差值

    • 计算 diff = abs(remaining_a - remaining_b)

    • 这是剩余材料a和材料b的差值。

  4. 使用万能材料填补差值

    • 如果 c >= diff,则使用万能材料填补差值。
    • 如果 c < diff,则使用万能材料全部填补到最少的材料上
    • 最大化使用万能材料additional_count = (remaining_a + remaining_b + c) // 4在填补差值后,剩余的万能材料可以用来进一步增加制作次数。

知识总结:


  1. 数学运算
  • 整数除法:使用 // 进行整数除法,例如 a // 2 表示将 a 除以 2 并取整数部分。
  • 取最小值:使用 min() 函数来获取两个数中的最小值,例如 min(a // 2, b // 2)
  • 取绝对值:使用 abs() 函数来获取一个数的绝对值,例如 abs(remaining_a - remaining_b)
  1. 贪心算法
  • 贪心策略:在每一步选择中都采取在当前状态下最优的选择,以期望最终结果是最优的。在这个问题中,我们首先计算不使用万能材料的情况下最多可以制作的次数,然后使用万能材料来填补差值,以最大化制作次数。
  1. 条件判断
  • 条件语句:使用 if 语句来进行条件判断,例如 if c >= diff,判断万能材料是否足够填补差值。
  • 多重条件:在某些情况下,可能需要使用 elseelif 来处理不同的条件分支。
  1. 变量更新
  • 变量赋值:在计算过程中,需要不断更新变量的值,例如 remaining_a = a - initial_count * 2
  • 变量累加:在计算最终结果时,可能需要将多个变量的值累加起来,例如 total_count = initial_count + additional_count
  1. 代码结构
  • 函数定义:使用 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)