问:
给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间。
请你将这些工作分配给 k 位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。
返回分配方案中尽可能 最小 的 最大工作时间 。
原题链接:https://leetcode.cn/problems/find-minimum-time-to-finish-all-jobs/
例:
输入:jobs = [3,2,3], k = 3
输出:3
解释:给每位工人分配一项工作,最大工作时间是 3 。
答:
class Solution {
public int minimumTimeRequired(int[] jobs, int k) {
Arrays.sort(jobs);
for (int i = 0, j = jobs.length-1; i < j; ++i, --j) {
int t = jobs[i];
jobs[i] = jobs[j];
jobs[j] = t;
}
//降序排序
int left = jobs[0];
int right = Arrays.stream(jobs).sum();
while(left < right)//二分查找,找出最大的工作时间
{
int mid = left+(right-left) / 2;
if(check(jobs,k,mid))
{
right = mid;
}
else
{
left = mid + 1;
}
}
return left;
}
public boolean check(int[] jobs,int k,int t)
{
int[] str = new int[k];
return arrange(jobs,str,0,t);
}
public boolean arrange(int[] jobs,int[] str,int p,int t)
{
if(p >= jobs.length)
return true;//没有工作了返回true
for(int i = 0;i < str.length;i++)
{
if(str[i] + jobs[p] <= t)
{
str[i] += jobs[p];
if(arrange(jobs,str,p+1,t))
{
return true;
}
str[i] -= jobs[p];
}
if(str[i] == 0)
{
return false;
}
if(str[i] + jobs[p] == t)
{
return false;
}
}
return false;
}
}