题目描述:
有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
输入格式
第一行包含整数 n。
第二行包含 n 个整数,其中第 i 个整数表示第 i 个人装满水桶所花费的时间 ti。
输出格式
输出一个整数,表示最小的等待时间之和。
数据范围
1≤n≤10^5,
1≤ti≤10^5
输入:
7
3 6 1 4 2 5 7
输出:
56
以下为
代码:
#include <bits/stdc++.h>
using namespace std;
const int AA=100000;
int n;
long long int sum;
int a[AA],tmp[AA];
void quick_sort(int l, int r)
{
if (l>=r) return;
int i=l-1,j=r+1,x=a[(l+r)/2];
while (i<j)
{
do i++; while(a[i]<x);
do j--; while(a[j]>x);
if (i<j)
swap(a[i],a[j]);
}
quick_sort(l,j), quick_sort(j+1,r);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<=n-1;i++) scanf("%d",&a[i]);
quick_sort(0,n-1);
for(int i=0;i<=n-1;i++)
sum=(n-i-1)*a[i]+sum;
cout<<sum<<endl;
}