经典算法

贪心算法-排队打水

有 N 个人排队到 R 个水龙头去打水,他们装满水桶的时间为整数 T1,T2,…,Tn,且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?

【贪心策略】

T越小的人,打水越要靠前。(每个人 T总时间 = T每个人打水时间 + T每个人等待时间)

【输入描述】

输入两行。第一行输入 N 个人,和水龙头数量 R;第二行输入每个水桶装满水的时间T。

【输出描述】

输出一行。输出打水总的花费时间。

【输入样例】

4 2
2 6 4 5
【输出样例】

23
【参考程序】

// 小牛编程
#include <bits/stdc++.h>
using namespace std;

// 每个人接水时间
int t[10001];

int main() {
    //人数,水龙头数
    int N, R, Sn = 0;
    cin >> N >> R;

    for (int i = 1; i <= N; i++)
        cin >> t[i];

    sort(t + 1, t + N);

    for (int i = 1; i <= N; i++) {
        if (i > R) {
            //接水时间和等待时间累加
            t[i] = t[i] + t[i - R]; //分组
        }
        Sn += t[i]; //累加
    }

    cout << Sn << endl;

    return 0;
}