1. 程式人生 > 實用技巧 >[Luogu] P1248 加工生產排程

[Luogu] P1248 加工生產排程

\(Link\)

Description

某工廠收到了\(n\)個產品的訂單,這\(n\)個產品分別在\(、A、B\)兩個車間加工,並且必須先在\(A\)車間加工後才可以到\(B\)車間加工。

某個產品\(i\)\(、A、B\)兩車間加工的時間分別為\(A_i,B_i\)​。怎樣安排這\(n\)個產品的加工順序,才能使總的加工時間最短。

這裡所說的加工時間是指:從開始加工第一個產品到最後所有的產品都已在\(、A、B\)兩車間加工完畢的時間。

Solution

一旦\(A\)車間開始加工,則\(A\)車間就會不停地進行作業,關鍵是\(B\)車間在加工過程中有可能要等待\(A\)車間。很明顯第一個產品在\(A\)

車間上加工時,\(B\)車間必須等待,最後一個產品在\(B\)車間上加工時,\(A\)車間也在等待\(B\)車間的完工。

所以我們要做的事就是:

(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; 
}