题目链接
题目梗概
一些人去排队打水,每个人所需打水的时间为time[i],问如何排列这些人,可以使得平均等待时间最少。
解题思路
方案是,打水时间少的优先打水。
证明:设n个人的打水时间为:T1,T2,T3…Tn
(已按从小到大排序)。
第2个人等待时间为:T1
;
第3个人等待时间为:T1 + T2
;
第4个人等待时间为:T1 + T2 + T3
;
…
第n个人等待时间为: T1 + T2 + T3 + … + T(n-1)
;
则所有人的总等待时间为 T = (n-1)*T1 + (n-2)*T2 + (n-3)*T3 + … + T(n-1)
;
假设现在排列T1 T2 … Ti … Tj … Tn(i<j)
不是最优
而是另一种T1 T2 … Tj… Ti … Tn
(交换了Ti和Tj的顺序),
第一个方案的总等待时间为Ts1 = (n-1)*T1 + (n-2)*T2 + … + (n-i)*Ti + … + (n-j)*Tj + … + T(n-1)
;
第二个方案的总等待时间为Ts2= (n-1)*T1 + (n-2)*T2 + … + (n-i)*Tj + … + (n-j)*Ti+ … + T(n-1)
将两个式子相减来比较大小,得
D = Ts1 - Ts2 = (n-i)Ti + (n-j)Tj - (n-i)Tj - (n-j)Ti = (n-i)(Ti - Tj) + (n-j)(Tj - Ti) = (n-i-n+j)(Ti-Tj) < 0
;
看到第一个方案等待时间更短,与题设不符,原排列最优。
完整代码
#include <iostream>
#include