在 Python 中找到完成所有作业的最小时间(给定约束条件)
假设我们有一个作业数组,其中包含不同的时间需求,有 k 个不同的分配者来分配作业,我们还知道分配者完成一个单位作业需要多少时间 t。我们必须在以下约束条件下找到完成所有作业的最小时间。
一个分配者只能分配连续的作业。
两个分配者不能共享或执行单个作业。
因此,如果输入类似于 k = 4,t = 5,job = {12, 6, 9, 15, 5, 9},则输出将为 75,因为我们通过分配 [12]、[6, 9]、[15] 和 [5, 9] 得到这个时间。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 is_valid()。这将采用时间、K 和作业作为参数。
n := 作业的大小
count := 1,curr_time := 0,i := 0
当 i < n 时,执行:
如果 curr_time + job[i] > time,则
curr_time := 0
count := count + 1
否则,
curr_time := curr_time + job[i]
i := i + 1
当 count <= K 时返回 true
从主方法中,执行以下操作:
n := 作业的大小
end := 0,begin := 0
对于 i 的范围从 0 到 n,执行:
end := end + job[i]
res := end
job_max := job 的最大值
当 begin <= end 时,执行:
mid := ((begin + end) / 2) 取整
如果 mid >= job_max 且 is_valid(mid, K, job) 为 true,则
res := res 和 mid 的最小值
end := mid - 1
否则,
begin := mid + 1
返回 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