豆包MarsCode AI刷题心得1——71.蛋糕工厂产能规划 | 豆包MarsCode AI刷题

122 阅读3分钟

题目分析

本题需要解决的是一个蛋糕工厂的生产优化问题,目标是在尽可能短的时间内完成订单所需的蛋糕生产。生产过程的主要特点包括:

  1. 工厂每天可以通过机器和工人的数量生产蛋糕。
  2. 可以用生产的蛋糕购买额外的机器或工人,从而提升产能。
  3. 需要尽量减少生产天数。

解决这一问题的关键是平衡产能的增长与蛋糕的直接生产时间,并在过程中动态调整策略以实现最优解。


解题思路

本题属于典型的贪心 + 模拟问题,主要分为以下几个步骤:

1. 建模与变量定义

  • mw 分别表示当前的机器和工人数。
  • p 是每次购买一台机器或一个工人所需的蛋糕数量。
  • n 是目标蛋糕数量。
  • candies 表示当前拥有的蛋糕数。
  • days 表示已经过去的生产天数。
  • minDays 记录达到目标所需的最小天数。

2. 基本逻辑

在每一天的生产过程中,需要解决以下几个核心问题:

  1. 蛋糕是否足够购买新设备
    如果蛋糕数量不足以购买设备,需要计算几天内能够积累到足够蛋糕。
  2. 平衡机器和工人数量
    优先提升数量较少的一方(机器或工人)以最大化生产力。
  3. 直接完成生产
    计算当前以现有产能直接生产到目标所需的天数,随时更新最小天数。

3. 优化策略

  • 动态调整策略
    每一步都在动态权衡:是直接生产完成目标,还是通过购买设备提升未来的生产效率。
  • 剪枝优化
    如果发现当前生产到目标的天数已经小于后续可能的改进,直接返回结果。

4. 实现与边界处理

  • 使用 long 类型防止溢出,确保在机器和工人数量极大的情况下计算不出错。
  • 通过模拟更新 candiesdays 的过程,找到最终的最小天数。

代码实现

以下是完整代码:

java
Copy code
public class Main {
    public static int solution(int m, int w, int p, int n) {
        int days = 0; // 当前天数
        long candies = 0; // 当前拥有的蛋糕数量
        int minDays = Integer.MAX_VALUE; // 用于记录最小的完成天数

        while (candies < n) {
            // 当前直接生产到目标所需天数
            long remaining = n - candies;
            int daysToProduce = (int) Math.ceil((double) remaining / (m * (long) w));
            minDays = Math.min(minDays, days + daysToProduce);

            // 如果当前蛋糕不足以购买设备,积累足够蛋糕
            if (candies < p) {
                int daysToGather = (int) Math.ceil((double) (p - candies) / (m * (long) w));
                days += daysToGather;
                candies += daysToGather * (m * (long) w);
            }

            // 购买设备,平衡机器和工人
            candies -= p;
            if (m <= w) {
                m++;
            } else {
                w++;
            }

            // 模拟一天的生产
            candies += m * (long) w;
            days++;
        }

        return Math.min(minDays, days);
    }

    public static void main(String[] args) {
        System.out.println(solution(3, 1, 2, 12)); // 输出: 3
        System.out.println(solution(10, 5, 30, 500)); // 输出: 8
        System.out.println(solution(3, 5, 30, 320)); // 输出: 14
    }
}

示例解释

以样例输入 3 1 2 12 为例:

  1. 第一天
    初始生产能力为 3 * 1 = 3,生产 3 个蛋糕。用 2 个蛋糕购买工人,机器和工人变为 m=3, w=2
  2. 第二天
    生产能力提升至 3 * 2 = 6,生产 6 个蛋糕。用 4 个蛋糕购买设备,剩余 3 个蛋糕,变为 m=4, w=3
  3. 第三天
    生产能力提升至 4 * 3 = 12,完成目标。

最终答案为 3


时间复杂度分析

  • 核心循环
    每天动态调整,循环次数与 n 的规模相关。
  • 复杂度
    单次操作的计算量为常数,时间复杂度为 O(log⁡(n))O(\log(n))O(log(n))。

总结

本题的难点在于如何动态调整机器与工人的数量平衡,保证生产效率的最大化,同时剪枝优化直接跳过冗余操作。通过贪心与模拟结合,代码能够高效处理大规模数据并输出正确结果。