问题描述
小明开了一家蛋糕工厂,目前工厂里面有 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,已经符合预期的产量了,所以只需要三天就可以完成生产计划
题解部分
-
初始化变量:
m
:初始机器数量w
:初始工人数量p
:每台机器或每个工人的成本n
:需要生产的蛋糕总数ans
:当前天数prod
:当前生产的蛋糕数量remaining
:剩余蛋糕数
-
每天的操作:
- 计算当天可以生产的蛋糕数量
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
}
}