#26. 排队打水
排队打水
有 个人排队到 个水龙头处打水,第 个人装满水桶所需的时间是 ,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
输入格式
第一行包含整数 。
第二行包含 个整数,其中第 个整数表示第 个人装满水桶所花费的时间 。
输出格式
输出一个整数,表示最小的等待时间之和。
数据范围
,
输入样例:
7
3 6 1 4 2 5 7
输出样例:
56
下面按 k=1..25 说明这套“单水龙头最小等待时间总和”数据分别在卡哪些常见错误做法。 (正确:按 t 从小到大排序,等待时间和 = 所有前缀和的累加;必须用 64 位存答案。)
- 样例:基础正确性(验证排序后计算)。
- n=1:答案应为 0;卡把“等待时间”误当“完成时间”(会输出 5)。
- n=2
[10,1]:卡不排序/按输入顺序算(会得到 10 而不是 1)。 - 已升序:卡基本公式(前缀累加)是否写对。
- 降序输入:应与 #4 相同;卡把输入顺序当最终顺序、不排序。
- 全相等(10 个 7):卡重复值处理/计算公式(很容易算错系数)。
- 大量重复混合:卡排序稳定性不重要但卡“按频次/去重”类错误(去重会严重错)。
- 包含最大值 10000:卡 int16/short 溢出、以及排序/累加正确性。
- 小随机(15 个):综合正确性,卡各种小 bug。
- n=1000 随机大范围:卡时间复杂度(O(n^2) 会慢)、以及实现健壮性。
- n=100000 全 1(压力):卡性能与 O(n log n);也卡循环/IO;答案规模大但规律明确。
- n=100000 全 10000(压力+大数):答案非常大,强卡 32 位溢出(用 int 会爆)。
- n=99999 1 与 10000 交替:卡排序(不排序会很糟)、也卡溢出与大前缀。
- 专卡“算成完成时间总和”:例如输入
[3,2,1],等待和=4,但完成和=10;卡把题意搞错。 - n=70000 全 10000(溢出专杀):答案约
10000*n*(n-1)/2,远超 2^31;强卡用 32 位保存答案。 - 小+大混合,逆序尤其糟:卡“不排序就算”的错误(差距很大)。
- 2000 个里多数是 1,少数大数:卡“只对大数排序/分桶不全”的错误实现;也卡性能。
- n=100000:1..10000 每个重复 10 次:卡计数排序/桶排序实现边界;也卡大规模正确性。
- n=100000:值域很小 1..10(大量重复):卡去重、卡桶排序/计数排序错误(频次处理),也卡性能。
- n=100000:全范围随机 1..10000:综合强测(排序+累加+溢出+性能)。
- n=3
[1,1,10000]:卡边界 + “大数放后面”策略是否生效;也卡把等待算错(比如多加/少加一次)。 - n=4
[10000,9999,1,1]:卡不排序/排序方向写反(降序会非常大)。 - 质数序列(8 个):综合正确性(无重复、分布不规则),卡写死规律/错误优化。
- n=50 打乱 1..50:卡排序正确性 + 输出单值;也卡实现是否与输入顺序无关。
- n=100000:1..10000 循环生成后打乱:综合强测(大量数据、完整值域、乱序),卡慢算法/溢出/排序错误。
如果你希望我再补一组“专门卡某种错公式”的(比如有人用 sum(t_i * (n-i)) 但 i 从 0/1 写错、或把等待时间算成包含自己),把那种错误公式贴出来,我可以再加几组一眼就能爆出来的用例。