目录
贪心算法(Greedy Algorithm),又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。
1.问题描述
有n个人排队到1个水龙头处打水,第i个人装满水桶所需的时间是 ,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
输入格式
第一行包含整数 n。
第二行包n个整数,其中第i个整数表示第i个人装满水桶所花费的时间 。
输出格式
输出一个整数,表示最小的等待时间之和。
题目来源 :AcWing 913.排队打水
2.解题思路
2.1例子分析
思路:
安排他们的打水顺序才能使所有人的等待时间之和最小,则需要将打水时间最短的人先打水。
证明:
假设
交换前时间:
交换后时间:
前 - 后:
因此,当对于越大的需要等待人数 (n - i),时间 越小越好
2.2 算法时间复杂度分析
因为我们要让时间短的人先接水,所以我们要对数据进行排序,我们可以使用algorithm库中的sort函数,时间复杂度为O(nlogn)。
3.算法实现
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int t[N];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &t[i]);
sort(t, t + n);
reverse(t, t + n);
LL res = 0;
for (int i = 0; i < n; i ++ ) res += t[i] * i;
printf("%lld\n", res);
return 0;
}