某工厂有 n n n 件物品需要进行加工,并且每件物品都需要先在 A A A 工厂加工 a i a_i ai 分钟,然后在 B B B 工厂加工 b i b_i bi分钟, A A A, B B B 工厂每次分别只能加工一件物品,问你最少需要多少时间能够加工完全部 n n n 件物品
假设有 n n n 件待完成事件,当前完成了 k k k 件,所花时间为 T T T,设当前先完成 i i i 事件再完成 j j j 事件的总时间代价为 T + T i , j T + T_{i,j} T+Ti,j,先完成 j j j 事件再完成 i i i 事件的总时间代价为 T + T j , i T + T_{j,i} T+Tj,i,那么若能够找到关于 T i , j < T j , i T_{i,j} < T_{j,i} Ti,j<Tj,i 的满足条件,那么该条件即为贪心法则的完备条件
假设当前已完成了 k k k 件物品的加工,其序列如下:
a 1 , a 2 , a 3 , . . . a k a_1, a_2, a_3, ... a_k a1,a2,a3,...ak
b 1 , b 2 , b 3 , . . . b k b_1, b_2, b_3, ... b_k b1,b2,b3,...bk
定义 A i = ∑ i = 1 i a i A_{i} = \sum_{i=1}^ia_i Ai=∑i=1iai为工厂 A A A 加工完前 i i i 件物品所花时间, B i = m a x ( A i , B i − 1 ) + b i B_{i}=max(A_i,B_{i-1})+b_{i} Bi=max(Ai,Bi−1)+bi 为工厂 B B B 加工完成前 i i i 件物品所花时间,那么此时有 A k = ∑ i = 1 k a i A_{k}=\sum_{i=1}^{k}a_{i} Ak=∑i=1kai, B k = m a x ( A i , B i − 1 ) + b k B_{k}=max(A_{i},B_{i-1})+b_{k} Bk=max(Ai,Bi−1)+bk
根据交换论证的步骤,接下来需要讨论加工顺序为 x , y x,y x,y 和 y , x y, x y,x 所花时间的大小关系
设此时先加工第 x x x 件物品所花时间为 B x = m a x ( A k + a x , B k ) + b x B_{x} = max(A_{k}+a_{x},B_{k})+b_{x} Bx=max(Ak+ax,Bk)+bx,先加工第 y y y 件物品所花时间为 B y = m a x ( A k + a y , B k ) + b y B_{y} = max(A_{k}+a_{y},B_{k})+b_{y} By=max(Ak+ay,Bk)+by,则有:
B x , y = m a x ( A k + a x + a y , m a x ( A k + a x , B k ) + b x ) + b y B_{x,y}=max(A_{k}+a_{x}+a_{y},max(A_{k}+a_{x}, B_{k})+b_{x}) + b_{y} Bx,y=max(Ak+ax+ay,max(Ak+ax,Bk)+bx)+by
B y , x = m a x ( A k + a x + a y , m a x ( A k + a y , B k ) + b y ) + b x B_{y,x}=max(A_{k}+a_{x}+a_{y},max(A_{k}+a_{y}, B_{k})+b_{y}) + b_{x} By,x=max(Ak+ax+ay,max(Ak+ay,Bk)+by)+bx
将上式中的 b x b_x bx 和 b y b_{y} by 移入 m a x max max 内部,得:
B x , y = m a x ( A k + a x + a y + b y , A k + a x + b x + b y , B k + b x + b y ) B_{x,y}=max(A_{k}+a_{x}+a_{y}+ b_{y},A_{k}+a_{x}+b_{x}+ b_{y}, B_{k}+b_{x}+ b_{y}) Bx,y=max(Ak+ax+ay+by,Ak+ax+bx+by,Bk+bx+by)
B y , x = m a x ( A k + a x + a y + b x , A k + a y + b x + b y , B k + b x + b y ) B_{y,x}=max(A_{k}+a_{x}+a_{y}+ b_{x},A_{k}+a_{y}+b_{x}+ b_{y}, B_{k}+b_{x}+ b_{y}) By,x=max(Ak+ax+ay+bx,Ak+ay+bx+by,Bk+bx+by)
显然当 B k + b x + b y B_{k}+b_{x}+ b_{y} Bk+bx+by 为最大值时对答案没有影响,故将其剔除
B x , y = m a x ( A k + a x + a y + b y , A k + a x + b x + b y ) = A k + a x + b y + m a x ( a y , b x ) B_{x,y}=max(A_{k}+a_{x}+a_{y}+ b_{y},A_{k}+a_{x}+b_{x}+ b_{y})=A_{k}+a_{x}+b_{y}+max(a_{y}, b_{x}) Bx,y=max(Ak+ax+ay+by,Ak+ax+bx+by)=Ak+ax+by+max(ay,bx)
B y , x = m a x ( A k + a x + a y + b x , A k + a y + b x + b y ) = A k + a y + b x + m a x ( a x , b y ) B_{y,x}=max(A_{k}+a_{x}+a_{y}+ b_{x},A_{k}+a_{y}+b_{x}+ b_{y})=A_{k}+a_{y}+b_{x}+max(a_{x}, b_{y}) By,x=max(Ak+ax+ay+bx,Ak+ay+bx+by)=Ak+ay+bx+max(ax,by)
不妨设 B x , y < B y , x B_{x,y} < B_{y, x} Bx,y<By,x,则有:
A k + a x + b y + m a x ( a y , b x ) < A k + a y + b x + m a x ( a x , b y ) A_{k}+a_{x}+b_{y}+max(a_{y}, b_{x}) < A_{k}+a_{y}+b_{x}+max(a_{x}, b_{y}) Ak+ax+by+max(ay,bx)<Ak+ay+bx+max(ax,by)
a x + b y + m a x ( a y , b x ) < a y + b x + m a x ( a x , b y ) a_{x}+b_{y}+max(a_{y}, b_{x})
m a x ( − b x , − a y ) < m a x ( − b y , − a x ) max(-b_{x}, -a_{y})
m i n ( b x , a y ) > m i n ( b y , a x ) min(b_{x}, a_{y})>min(b_{y}, a_{x}) min(bx,ay)>min(by,ax)
即当物品 x x x 和物品 y y y 满足 m i n ( b x , a y ) > m i n ( b y , a x ) min(b_{x}, a_{y})>min(b_{y}, a_{x}) min(bx,ay)>min(by,ax) 条件时, B x , y < B y , x B_{x,y} < B_{y,x} Bx,y<By,x
但是该条件是不完备的,即该条件不满足传递性,若此时 m i n ( b x , a y ) = m i n ( b y , a x ) min(b_{x}, a_{y})=min(b_{y}, a_{x}) min(bx,ay)=min(by,ax),则理论上 B x , y = B y , x B_{x,y}=B_{y,x} Bx,y=By,x,事实上也确实如此,但是由于 B i = m a x ( A i , B i − 1 ) + b i B_{i}=max(A_i,B_{i-1})+b_{i} Bi=max(Ai,Bi−1)+bi,所以 a i a_{i} ai 的前缀和 A i A_{i} Ai 对于后续答案的统计是有影响的,出现这种情况的根源在于推导式子时正确的传递条件应当在 m i n ( b x , a y ) = m i n ( b y , a x ) min(b_{x}, a_{y})=min(b_{y}, a_{x}) min(bx,ay)=min(by,ax) 的条件下继续判断 a i a_{i} ai 的大小,以满足排序条件的传递性
下面这组例子可以帮助理解:
3
2 100 3
1 1 1
这三件物品根据判断条件来看是等价的,但是其加工顺序不一样会导致结果不一样
再举一个例子,假设此时 ∀ i ∈ [ 1 , n ] , b i = c , a i ≥ c \forall i \in [1, n],b_{i}=c,\ a_{i}\geq c ∀i∈[1,n],bi=c, ai≥c,理论上来说总时间 B n = A n + c B_{n}=A_{n}+c Bn=An+c 并且有 B i = A i + c B_{i}=A_{i}+c Bi=Ai+c,但若此时 a i a_{i} ai 为无穷大,则会导致 A A A 工厂流水线阻塞,为了避免这种情况或者说为了使得对于 ∀ i ∈ [ 1 , n ] , B i = A i + c \forall i \in [1, n],B_{i}=A_{i}+c ∀i∈[1,n],Bi=Ai+c,我们显然需要将 a i a_{i} ai 小的先行加工
那么问题究竟出在了哪里呢?
在上述推导中显然我们只考虑了两件物品的先后关系,若每两件物品均满足 B x , y < B y , x B_{x,y} < B_{y,x} Bx,y<By,x 的优先关系,称任意两件物品具有可比性,若 ∃ x , y , B x , y = B y , x \exists x,y,B_{x,y} = B_{y,x} ∃x,y,Bx,y=By,x,则需要考虑其顺序的后效性,或者说是排序条件的传递性