前言
贪心问题最常用的证明方法还是反证法。
一、题目陈述
二、解决思路
1.打水次序安排
假设排序为t1
t2
t3
...
tn
,则总的等待时间为:
t1*(n-1)+t2*(n-2)+...+tn*0
,容易看出,为了让总的等待时间最小,必须让每个人的打水时间从小到大排序,打水时间最长的应该在最后打水。
2.求总等待时间
如果先求前缀和在累加,会多出很多运算量。不如直接利用公式t1*(n-1)+t2*(n-2)+...+tn*0
计算。
三、代码实现
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int t[N];
typedef long long ll;
int main() {
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>t[i];
sort(t,t+n);
ll res = 0;
for(int i=0;i<n;i++) res += t[i] * (n - i - 1);
printf("%lld\n",res);
return 0;
}
总结
推出总等待时间的公式,累积计算的时候可以直接利用公式,而不用先求前缀和。