#26. 排队打水

排队打水

nn 个人排队到 11 个水龙头处打水,第 ii 个人装满水桶所需的时间是 tit_i,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?

输入格式

第一行包含整数 nn

第二行包含 nn 个整数,其中第 ii 个整数表示第 ii 个人装满水桶所花费的时间 tit_i

输出格式

输出一个整数,表示最小的等待时间之和。

数据范围

1n1051 \le n \le 10^5,
1ti1041 \le t_i \le 10^4

输入样例:

7
3 6 1 4 2 5 7

输出样例:

56

下面按 k=1..25 说明这套“单水龙头最小等待时间总和”数据分别在卡哪些常见错误做法。 (正确:按 t 从小到大排序,等待时间和 = 所有前缀和的累加;必须用 64 位存答案。)

  1. 样例:基础正确性(验证排序后计算)。
  2. n=1:答案应为 0;卡把“等待时间”误当“完成时间”(会输出 5)。
  3. n=2 [10,1]:卡不排序/按输入顺序算(会得到 10 而不是 1)。
  4. 已升序:卡基本公式(前缀累加)是否写对。
  5. 降序输入:应与 #4 相同;卡把输入顺序当最终顺序、不排序。
  6. 全相等(10 个 7):卡重复值处理/计算公式(很容易算错系数)。
  7. 大量重复混合:卡排序稳定性不重要但卡“按频次/去重”类错误(去重会严重错)。
  8. 包含最大值 10000:卡 int16/short 溢出、以及排序/累加正确性。
  9. 小随机(15 个):综合正确性,卡各种小 bug。
  10. n=1000 随机大范围:卡时间复杂度(O(n^2) 会慢)、以及实现健壮性。
  11. n=100000 全 1(压力):卡性能与 O(n log n);也卡循环/IO;答案规模大但规律明确。
  12. n=100000 全 10000(压力+大数):答案非常大,强卡 32 位溢出(用 int 会爆)。
  13. n=99999 1 与 10000 交替:卡排序(不排序会很糟)、也卡溢出与大前缀。
  14. 专卡“算成完成时间总和”:例如输入 [3,2,1],等待和=4,但完成和=10;卡把题意搞错。
  15. n=70000 全 10000(溢出专杀):答案约 10000*n*(n-1)/2,远超 2^31;强卡用 32 位保存答案。
  16. 小+大混合,逆序尤其糟:卡“不排序就算”的错误(差距很大)。
  17. 2000 个里多数是 1,少数大数:卡“只对大数排序/分桶不全”的错误实现;也卡性能。
  18. n=100000:1..10000 每个重复 10 次:卡计数排序/桶排序实现边界;也卡大规模正确性。
  19. n=100000:值域很小 1..10(大量重复):卡去重、卡桶排序/计数排序错误(频次处理),也卡性能。
  20. n=100000:全范围随机 1..10000:综合强测(排序+累加+溢出+性能)。
  21. n=3 [1,1,10000]:卡边界 + “大数放后面”策略是否生效;也卡把等待算错(比如多加/少加一次)。
  22. n=4 [10000,9999,1,1]:卡不排序/排序方向写反(降序会非常大)。
  23. 质数序列(8 个):综合正确性(无重复、分布不规则),卡写死规律/错误优化。
  24. n=50 打乱 1..50:卡排序正确性 + 输出单值;也卡实现是否与输入顺序无关。
  25. n=100000:1..10000 循环生成后打乱:综合强测(大量数据、完整值域、乱序),卡慢算法/溢出/排序错误。

如果你希望我再补一组“专门卡某种错公式”的(比如有人用 sum(t_i * (n-i)) 但 i 从 0/1 写错、或把等待时间算成包含自己),把那种错误公式贴出来,我可以再加几组一眼就能爆出来的用例。