思路:
(1)流程:
- 输入
- 由小到大排序
- 逐个统计,对于每个a[i],乘(n - i + 1),描述每个等待时间即可;
(2)证明其最小:设 t = a1b1 + a2b2 + ... + anbn;由于无论怎样安排,b1 b2.. bn都是n-1;n-2;...0;由大到小,由于顺序和大于乱序和大于逆序和;所以a1~an由小到大则最小。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
int a[N];
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++)
cin >> a[i];
sort(a,a + n);
LL res = 0;
for(int i = 0;i < n;i ++)
{
res += (LL)a[i]*(n -i - 1);
}
cout << res << endl;
return 0;
}