[Luogu] P1248 加工生產排程
阿新 • • 發佈:2020-11-23
Description
某工廠收到了\(n\)個產品的訂單,這\(n\)個產品分別在\(、A、B\)兩個車間加工,並且必須先在\(A\)車間加工後才可以到\(B\)車間加工。
某個產品\(i\)在\(、A、B\)兩車間加工的時間分別為\(A_i,B_i\)。怎樣安排這\(n\)個產品的加工順序,才能使總的加工時間最短。
這裡所說的加工時間是指:從開始加工第一個產品到最後所有的產品都已在\(、A、B\)兩車間加工完畢的時間。
Solution
一旦\(A\)車間開始加工,則\(A\)車間就會不停地進行作業,關鍵是\(B\)車間在加工過程中有可能要等待\(A\)車間。很明顯第一個產品在\(A\)
所以我們要做的事就是:
(1)就要把在\(A\)車間加工時間最短的部件優先加工,這樣使得\(B\)車間能以最快的速度開始加工
(2)把放在\(B\)車間加工時間最短的產品放在最後加工,這樣使得最後\(A\)車間的空閒時間最少
Code
#include <bits/stdc++.h> using namespace std; int n, ta, tb, l, r, a0[1005], b0[1005], ord[1005]; struct node { int a, b, id; }p[1005]; int read() { int x = 0, fl = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') fl = -1; ch = getchar();} while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0'; ch = getchar();} return x * fl; } int cmp(node x, node y) { return min(x.a, x.b) < min(y.a, y.b); } int main() { n = read(); for (int i = 1; i <= n; i ++ ) p[i].a = read(), a0[i] = p[i].a; for (int i = 1; i <= n; i ++ ) p[i].b = read(), b0[i] = p[i].b; for (int i = 1; i <= n; i ++ ) p[i].id = i; sort(p + 1, p + n + 1, cmp); l = 0; r = n + 1; for (int i = 1; i <= n; i ++ ) (p[i].a < p[i].b) ? ord[ ++ l] = p[i].id : ord[ -- r] = p[i].id; for (int i = 1; i <= n; i ++ ) { ta += a0[ord[i]]; tb = max(ta, tb) + b0[ord[i]]; } printf("%d\n", tb); for (int i = 1; i <= n; i ++ ) printf("%d ", ord[i]); puts(""); return 0; }