青训营刷题-蛋糕工厂题解(豆包)

5 阅读3分钟

问题描述

小明开了一家蛋糕工厂,目前工厂里面有 m 台机器和 w 个工人,每天可以生产的蛋糕数量是 m * w。有一天他接到了一个订单,需要生产 n 个蛋糕,客户希望能够尽快的一次性交付,但是他算不清楚需要多少天才能生产完,请你帮帮小明。(提示:为了提升产能,每天可以用蛋糕购买额外的机器或者工人,每台机器或者每个工人,需要花费 p 个蛋糕。)

为了方便理解,我们举个例子:假如最开始小明的工厂只有 m = 1 台机器和 w = 2 个工人,每次扩大产能需要的花费是 p = 1,为了生产 n = 60 个蛋糕,可以这么操作:

  • 第一天:m * w = 1 * 2 = 2 生产 2 个蛋糕,同时新增 2 台机器,此时 m = 3,剩余蛋糕 0

  • 第二天:m * w = 3 * 2 = 6 生产 6 个蛋糕,同时新增 3 台机器,3 个工人,此时 m = 6, w = 5,剩余蛋糕 0

  • 第三天:m * w = 6 * 5 = 30

  • 第四天:m * w = 6 * 5 = 30 所以在第四天就完成了生产计划

输入格式

输入的数据只有一行,空格分割的四个整数,代表 m, w, p, n

数据约束

  • 1 <= m, w, p, n <= 10^8

输出格式

输出一个整数用来表示需要几天才能完成生产计划

输入样例

3 1 2 12

输出样例

3

样例解释

  • 第一天:生产的蛋糕数量 m * w = 3 * 1 = 3。此时花 2 个蛋糕,雇佣了另外一个工人,此时 w = 2,依然剩余 1 个蛋糕

  • 第二天:生产的蛋糕数量 3 * 2 = 6。此时花 2 * p = 4 个蛋糕雇佣了另外一个工人,同时新增了另外一台机器,此时 m = 4, w = 3,而且剩余 3 个蛋糕(包括第一天剩余的那一个)

  • 第三天:生产的蛋糕数量 4 * 3 = 12,已经符合预期的产量了,所以只需要三天就可以完成生产计划

题解部分

  1. 初始化变量

    • m:初始机器数量
    • w:初始工人数量
    • p:每台机器或每个工人的成本
    • n:需要生产的蛋糕总数
    • ans:当前天数
    • prod:当前生产的蛋糕数量
    • remaining:剩余蛋糕数
  2. 每天的操作

    • 计算当天可以生产的蛋糕数量 prod = m * w`
    • 如果当天生产的蛋糕数量大于或等于 n,则任务完成,返回当前天数 ans
    • 否则,更新剩余需要生产的蛋糕数量 n -= remaining
    • 计算可以购买的新机器和工人数(extraMachines = buy / 2; extraWorkers = buy - extraMachines)
    • 更新 m 和 w
    • 增加天数 ans
代码
    public static int solution(int m, int w, int p, int n) {
        int ans = 0;
        long prod = (long) m * w;
        long remaining = n;

        while (remaining > 0) {
            if (remaining <= prod) {
                // 如果剩余的蛋糕数量小于等于当前的生产量,直接生产完
                ans += (int) Math.ceil((double) remaining / prod);
                break;
            } else {
                // 计算可以购买的机器或工人数
                long buy = prod / p;
                if (buy > 0) {
                    long extraMachines = buy / 2;
                    long extraWorkers = buy - extraMachines;
                    m += extraMachines;
                    w += extraWorkers;
                }
                // 更新剩余的蛋糕数量
                remaining -= prod;
                // 更新生产量
                prod = (long) m * w;
                // 增加一天
                ans++;
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(3, 1, 2, 12) == 3); // true
        System.out.println(solution(1, 2, 1, 60) == 4); // true
        System.out.println(solution(1, 3, 3, 6) == 2); // true
    }
}