给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间。
请你将这些工作分配给 k 位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。
返回分配方案中尽可能 最小 的 最大工作时间 。
猜到了今天是个困难题,话说这个题目怎么这么眼熟。。。原来它和 在 D 天内送达包裹的能力 这道题一非常相似!!!唯一的不同就是包裹那题要求分配顺序保持不变,但是工作分配可以随意变换。
看完官方解答,感觉这个不同导致的难度上升不止一星半点,我还是太天真了
有个能看懂的python解法,感谢大佬!
class Solution:
def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
def check(limit):
# 剪枝:排序后,大的先拿出来试,如果方案不行,失败得更快
arr = sorted(jobs)
groups = [0] * k
# 分成K 组,看看在这个limit 下 能不能安排完工作
if backtrace(arr, groups, limit):
return True
else:
return False
def backtrace(arr, groups, limit):
# 尝试每种可能性
#print(arr, groups, limit)
if not arr: return True #分完,则方案可行
v = arr.pop()
for i in range(len(groups)):
if groups[i] + v <= limit:
groups[i] += v
if backtrace(arr, groups, limit):
return True
groups[i] -= v
# 剪枝,如果这个工人没分到活,那别人肯定得多干活了,那最后的结果必然不是最小的最大值,就不用继续试了。
if groups[i] ==0:
break
arr.append(v)
return False
#每个人承担的工作的上限,最小为,job 里面的最大值,最大为 jobs 之和
l, r = max(jobs), sum(jobs)
while l < r:
mid = (l + r)//2
if check(mid):
r = mid
else:
l = mid + 1
return l