题解 蛋糕工厂产能规划 | 豆包MarsCode AI刷题

236 阅读5分钟

要解决小明的蛋糕生产优化问题,我们需要制定一个高效的策略,以在最短的时间内完成生产目标。下面将详细解释解决该问题的思路和步骤。

问题理解

目标:在最少的天数内生产出至少 n 个蛋糕。

初始条件

  • 机器数量:m
  • 工人数:w
  • 每天的生产能力:m × w 个蛋糕
  • 购买一台机器或一名工人的成本:p 个蛋糕
  • 可以在任何一天使用当天生产的蛋糕来购买更多的机器或工人。

约束

  • 机器和工人的数量均为正整数。
  • 目标是最小化完成生产所需的天数。

解题思路

要在最短时间内完成生产,我们需要在适当的时候投资购买更多的机器和工人,以提升每天的生产能力。然而,过早或过晚的投资都可能导致效率不高。因此,需要一种平衡策略来决定何时以及如何进行投资。

主要策略

  1. 二分查找法

    • 由于生产天数是一个单调递增的函数(天数越多,生产的蛋糕总数越多),我们可以使用二分查找法来确定最小的天数。
    • 设定一个合理的天数范围,从 1 天到一个上限(如 n 天,因为每天至少生产 m × w 个蛋糕,通常远小于 n)。
    • 在每次迭代中,计算中间值 mid,判断在 mid 天内是否能够生产出至少 n 个蛋糕。
    • 根据判断结果调整搜索范围,直到找到最小的可行天数。
  2. 计算生产能力

    • 在任意给定的天数内,计算小明能够生产出多少蛋糕。
    • 需要考虑购买机器和工人的最佳时机,以最大化生产效率。
  3. 优化购买策略

    • 在购买机器或工人时,优先考虑平衡机器和工人的数量,以避免某一方成为瓶颈。
    • 计算在特定天数内,最佳的机器和工人组合。

详细步骤

  1. 初始化

    • 设置搜索范围的下限 left = 1 天。
    • 设置搜索范围的上限 right = n 天(理论最大天数)。
    • 初始化最小天数 min_days = n
  2. 二分查找循环

    • left 小于等于 right 时,进行以下步骤:
      • 计算中间值 mid = (left + right) // 2 天。
      • 计算在 mid 天内,小明是否能够生产出至少 n 个蛋糕。
  3. 判断函数

    • 目标:在 mid 天内,是否可以生产至少 n 个蛋糕。
    • 计算步骤
      • 初始化:
        • 当前机器数量 current_m = m
        • 当前工人数 current_w = w
        • 当前生产能力 current_production = current_m * current_w
        • 当前累计蛋糕数 total_cakes = 0
      • 模拟每一天的生产和投资:
        • 对于每一天 day1mid
          • 生产蛋糕:total_cakes += current_production
          • 检查是否达到目标:
            • 如果 total_cakes >= n,返回 True(可行)
          • 判断是否有足够的蛋糕进行投资:
            • 如果 total_cakes >= p,计算可购买的数量 can_buy = total_cakes // p
            • 平衡购买机器和工人:
              • 目标是使 current_mcurrent_w 尽可能接近,以最大化生产能力。
              • 计算新的机器和工人数量:
                • new_m = current_m + can_buy // 2
                • new_w = current_w + can_buy - (can_buy // 2)
              • 更新 current_mcurrent_w
                • current_m = new_m
                • current_w = new_w
              • 更新生产能力 current_production = current_m * current_w
              • 减少已用于购买的蛋糕数 total_cakes -= can_buy * p
      • 如果在 mid 天内未达到目标,返回 False(不可行)
  4. 调整搜索范围

    • 如果判断函数返回 True,说明在 mid 天内可行:
      • 更新 min_days = mid
      • 收缩搜索范围到左半部分 right = mid - 1
    • 否则,说明 mid 天内不可行:
      • 扩大搜索范围到右半部分 left = mid + 1
  5. 结束条件

    • left 大于 right 时,搜索结束,min_days 即为最小所需天数。

关键优化点

  1. 平衡机器和工人

    • 为了最大化生产能力,保持机器和工人的数量尽可能接近是关键。这是因为生产能力为 m × w,在机器和工人数量相等时,乘积最大。
  2. 避免过多的迭代

    • 通过二分查找,大幅减少需要检查的天数范围,提高效率。
  3. 提前终止条件

    • 在任何一天内,如果已达成生产目标,可以立即终止模拟,避免不必要的计算。
  4. 处理大数

    • 在计算累计蛋糕数时,确保使用足够大的数据类型以防止溢出(在编程实现中尤为重要)。

示例解析

让我们通过样例1来理解上述策略:

样例1

输入:m = 3, w = 1, p = 2, n = 12
输出:3

过程分析

  • 第1天

    • 生产:3 × 1 = 3 个蛋糕。
    • 总蛋糕数:3
    • 可以购买:3 // 2 = 1 单位(购买1台机器或1名工人)。
    • 优先购买机器或工人,使数量平衡。假设购买1名工人:
      • 机器数 m = 3,工人数 w = 2
      • 剩余蛋糕数:3 - 2 = 1
  • 第2天

    • 生产:3 × 2 = 6 个蛋糕。
    • 总蛋糕数:1 + 6 = 7
    • 可以购买:7 // 2 = 3 单位。
    • 优先平衡机器和工人:
      • 当前 m = 3w = 2
      • 购买2台机器和1名工人:
        • 机器数 m = 5,工人数 w = 3
      • 剩余蛋糕数:7 - 6 = 1
  • 第3天

    • 生产:5 × 3 = 15 个蛋糕。
    • 总蛋糕数:1 + 15 = 16
    • 已超过目标 n = 12,完成订单。

总共用了 3 天。

样例2和样例3

通过类似的分析,可以验证样例2和样例3的输出是合理的。关键在于合理分配购买机器和工人的数量,以最大化生产效率,并通过二分查找快速定位最优天数。

总结

通过上述策略,我们可以有效地计算出在给定条件下完成蛋糕订单所需的最少天数。关键在于:

  1. 使用二分查找法缩小搜索范围,提高效率。
  2. 合理平衡机器和工人的数量,最大化生产能力。
  3. 及时进行投资,提升长期生产效率。

这种方法不仅适用于当前的问题,也可以推广到类似的生产优化和资源分配问题中。