力扣完成所有工作的最短时间
class Solution {
public:
/*
@param idx 是jobs序号
*/
bool recurse(int limit, int idx, vector<int> &jobs, vector<int> &workers) {
if (idx == jobs.size()) {
return true;
}
if (jobs[idx] > limit) {
return false;
}
for (int w = 0; w < workers.size(); ++w) {
if (workers[w] + jobs[idx] <= limit) {
workers[w] += jobs[idx];
if (recurse(limit, idx + 1, jobs, workers)) {
return true;
}
workers[w] -= jobs[idx];
if (workers[w] == 0) {
//剪枝优化,当遇到前面的worker还没分配工作时,剪枝
break;
}
}
}
return false;
}
int minimumTimeRequired(vector<int>& jobs, int k) {
sort(jobs.begin(), jobs.end(), greater<int>());
int l = 0, r = accumulate(jobs.begin(), jobs.end(), 0);
/* 使用二分法寻找符合的值,再去验证他 */
while (l < r) {
int mid = (l + r) / 2;
vector<int> workers(k, 0);
if (recurse(mid, 0, jobs, workers)) {
r = mid;
}
else {
l = mid + 1;
}
}
return l;
}
};