原题链接:https://www.acwing.com/problem/content/description/915/
题目分析
可以用排序不等式证明贪心策略的正确性
已知每一个人的打水时间,求总共的等待时间最少
t总 = (ti * 后面的人数);最小就是ti升序,后面的等待人数降序.
也就是打水时间少的先打水
也可以用反证法
假设最小序列不是t升序,则交换逆序的两个数,显然可以减少时间
补充:贪心常用证明方法就是反证和数学归纳
c++代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int t[N];
LL res = 0;
bool cmp(int a, int b){
return a > b;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &t[i]);
sort(t, t + n, cmp);
for (int i = 0; i < n; i ++ ) res += t[i] * i;
printf("%lld\n", res);
return 0;
}
注意:
- 结果有可能爆int 用long long定义它
- 从大到小还可以用reverse(a,a+n)或者sort(a,a+n,greater<int>());