题目描述
有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
样例
输入样例:
7
3 6 1 4 2 5 7
输出样例:
56
贪心算法
按时间从小到大排序
ans=t1*(n-1)+t2*(n-2)+t3*(n-3)......+tn*1
证明:若ti>ti+1
,则ti*(n-i)+ti+1*(n-i-1)
交换ti,ti+1
,则ti+1*(n-i)+ti*(n-i-1)
相减得ti-ti+1>0
说明ti>ti+1
不合理
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int p[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)cin>>p[i];
sort(p,p+n);
long long res=0;
for(int i=0;i<n;i++)
res+= p[i]*(n-i-1);
cout<<res<<endl;
return 0;
}