在Python中找到在给定约束下完成所有作业的最短时间
假设我们有一系列具有不同时间要求的工作,有k个不同的人来分配工作,并且我们还有一个受让人完成一个单位的工作需要多少时间。我们必须找到在以下限制条件下完成所有作业的最短时间。
只能为受让人分配连续的工作。
两个受让人无法共享或执行一项工作。
因此,如果输入像k=4,t=5,作业={12,6,9,9,15,5,9},那么这次我们通过分配[12],[6,9],[15]和[5,9]
为了解决这个问题,我们将遵循以下步骤-
定义一个函数is_valid()。这需要时间,K,工作
n:=工作规模
计数:=1,curr_time:=0,i:=0
当我<n时
curr_time:=curr_time+工作[i]
我:=我+1
curr_time:=0
数:=数+1
如果curr_time+job[i]>时间,则
除此以外,
当count<=K时返回true
在主要方法中,执行以下<
n:=工作规模
结束:=0,开始:=0
对于0到n范围内的i,执行
结束:=结束+工作[i]
res:=结束
job_max:=最大工作
在开始<=结束时,执行
开始:=中+1
res:=最小res,中
结束:=中-1
中:=((begin+end)/2)取整数部分
如果mid>=job_max并且is_valid(mid,K,job)为true,则
除此以外,
返回res*T
示例
让我们看下面的实现以更好地理解-
def is_valid(time, K, job): n = len(job) count = 1 curr_time = 0 i = 0 while i < n: if curr_time + job[i] > time: curr_time = 0 count += 1 else: curr_time += job[i] i += 1 return count <= K def get_minimum_time(K, T, job): n = len(job) end = 0 begin = 0 for i in range(n): end += job[i] res = end job_max = max(job) while begin <= end: mid = int((begin + end) / 2) if mid >= job_max and is_valid(mid, K, job): res = min(res, mid) end = mid - 1 else: begin = mid + 1 return res * T job = [12, 6, 9, 15, 5, 9] k = 4 T = 5 print(get_minimum_time(k, T, job))
输入值
4, 5, [12, 6, 9, 15, 5, 9]
输出结果
75