在 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