top1编程
← 返回上一页

P216. 【基础】排队打水问题

时间限制
1000 ms
内存限制
32 MiB
难度
8
知识点
算法
知识点
贪心
知识点
题源
知识点
东方博宜

题目描述

有 n 个人排队到 r 个水龙头前去打水,每个人装满水桶所需的时间为 t₁, t₂, ..., tₙ,这些时间均为整数且互不相等。
请你安排他们的打水顺序,使得所有人花费的总时间最少。

时间计算规则:
每个人的花费时间 = 排队等待时间 + 自己打水时间。
假设一个人打完水后,下一个人立即接上,切换过程不消耗时间。

示例说明:
有 2 个人 A 和 B,打水时间分别为 3 和 2,只有 1 个水龙头。
若 A 先打水,B 后打水:

  • A 花费时间 = 0(排队)+ 3(打水)= 3
  • B 花费时间 = 3(排队)+ 2(打水)= 5
  • 总时间 = 3 + 5 = 8

若 B 先打水,A 后打水,总时间 = 2 + (2+3) = 7,更优。


输入格式

第一行两个整数 n 和 r,分别表示人数和水龙头个数。
第二行 n 个正整数 t₁, t₂, ..., tₙ,表示每个人打水所需的时间。

数据范围:

  • 1 ≤ n ≤ 500
  • 1 ≤ r ≤ 100
  • 1 ≤ tᵢ ≤ 1000

输出格式

输出一个正整数,表示所有人花费的最少总时间。


样例输入

4 2
2 6 4 5

样例输出

23

提示

本题可使用贪心策略:
将打水时间从小到大排序,然后依次分配到当前等待时间最短的水龙头,即可使总等待时间最小。