兩台機器 M1, M2,n 個任務。任務 i 必須先在 M1 處理 t1_i 時間,再在 M2 處理 t2_i 時間。任務順序可任意調換。求最小總完工時間(makespan)。
t1_i ≤ t2_i(M1 時間較短)t1_i > t2_i(M2 時間較短)t1_i **非遞減**排序(短任務優先)。t2_i **非遞增**排序(長任務優先)。相鄰交換論證:對任意相鄰任務 i, j,若違反上述規則則交換後不劣。完整證明見《調度理論》教材。
struct Task { int t1, t2; };
bool cmpA(Task a, Task b) { return a.t1 < b.t1; }
bool cmpB(Task a, Task b) { return a.t2 > b.t2; }
int main() {
int n; while (cin >> n, n) {
vector A, B;
for (int i=0;i>t1>>t2;
if (t1 <= t2) A.push_back({t1,t2});
else B.push_back({t1,t2});
}
sort(A.begin(), A.end(), cmpA);
sort(B.begin(), B.end(), cmpB);
vector seq = A; seq.insert(seq.end(), B.begin(), B.end());
int t1_end = 0, makespan = 0;
for (auto& t : seq) {
t1_end += t.t1;
makespan = max(makespan, t1_end) + t.t2;
}
cout << makespan << "\n";
}
}
排序 O(n log n),模擬 O(n)。n ≤ 10000 輕鬆通過。
三機器問題已證為 NP-hard,無多項式精確算法,需啟發式或近似算法。