排队打水
问题描述
有 n个人排队到 1 个水龙头处打水,第 i个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
输入格式
第一行包含整数 n。
第二行包含 n个整数,其中第 i个整数表示第 i个人装满水桶所花费的时间 ti。
输出格式
输出一个整数,表示最小的等待时间之和。
数据范围
1≤n≤105,1≤ti≤104
输入样例
7
3 6 1 4 2 5 7
输出样例
56
问题分析
通过题意,我们知道要使T=t1*(n-1)+t2*(n-2)+…+tn*0;为了让这个T数值最小,只需要将每个人的打水时间从小到大进行排序。下面代码在计算的时候是从大到小进行排序的。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
int a[N];
int n;
int main()
{cin>>n;for(int i=0;i<n;i++) cin>>a[i];sort(a,a+n); //将a数组从小到大排序reverse(a,a+n); //反转a数组的值ll res=0;for(int i=0;i<n;i++) res+=a[i]*i;cout<<res<<endl;return 0;
}