问题描述
小明的蛋糕工厂每天可以生产的蛋糕数量是由工厂中的机器和工人的数量决定的,即 ( m \times w )。现在他收到了一个大订单,需要尽快生产出 ( n ) 个蛋糕。为了提升生产速度,小明可以使用每天生产的蛋糕去购买额外的机器或工人,每台机器或每个工人的成本是 ( p ) 个蛋糕。
例如,如果工厂起始时有 1 台机器和 2 个工人,每次扩大产能的成本是 1 个蛋糕,为了生产 60 个蛋糕,小明可以这样操作:
- 第一天:生产 2 个蛋糕,买入 2 台机器(总机器数变为 3)。
- 第二天:生产 6 个蛋糕,买入 3 台机器,3 个工人(机器数 6,工人数 5)。
- 第三天:生产 30 个蛋糕。
- 第四天:再生产 30 个蛋糕,完成订单。
你的任务是帮助小明计算最快多少天能完成订单。
测试样例
样例1:
输入:
m = 3, w = 1, p = 2, n = 12
输出:3
样例2:
输入:
m = 10, w = 5, p = 30, n = 500
输出:8
样例3:
输入:
m = 3, w = 5, p = 30, n = 320
输出:14
#include <iostream>
bool check(int k, int m, int w, int p, int n) {
long long cake =
static_cast<long long>(m) * w; // Using long long to prevent overflow
// If we can complete without scaling production
if (cake * k >= n)
return true;
int cnt = 1;
while (cake < n) {
// Number of production units we can add
int add = cake / p;
// Balance the production
if (m < w) {
std::swap(m, w);
}
int diff = m - w;
if (add <= diff)
w += add;
else {
int total = add + m + w;
w = total / 2;
m = total - w;
}
// Remaining cake
cake %= p;
// Check if we can complete in remaining time
if (cake + (static_cast<long long>(m) * w * (k - cnt)) >= n)
return true;
// One more day passes
cnt++;
cake += static_cast<long long>(m) * w;
}
return cnt <= k;
}
int solution(int m, int w, int p, int n) {
// Left open, right open binary search
int l = 0, r = n / (m * w) + 2;
while (l + 1 < r) {
int mid = (l + r) >> 1; // Equivalent to (l + r) / 2
if (check(mid, m, w, p, n))
r = mid;
else
l = mid;
}
return r;
}
int main() {
// You can add more test cases here
std::cout << (solution(3, 1, 2, 12) == 3) << std::endl;
std::cout << (solution(10, 5, 30, 500) == 8) << std::endl;
std::cout << (solution(3, 5, 30, 320) == 14) << std::endl;
return 0;
}