排序
当第 i i i个人打水的时候,其余 i + 1 \ i+1 i+1 ~ n n n个人需要等待 t i t_i ti的时间,直到最后一个人打完水
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef long long ll;
int a[N];
int n;
int main(){
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
sort(a,a + n);
ll res = 0;
for(int i = 0; i < n; i++){
res += a[i] * (n - i - 1);
}
cout << res << endl;
return 0;
}
排序+前缀和
稍微有点难理解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n;
int a[N];
int s[N];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
sort(a, a + n);
ll res = 0, t = 0;
for(int i = 1; i <= n; i++){
s[i] = s[i - 1] + a[i];
}
//第一个人要等第一个桶装满的时间,最后一个人只需等待56分钟,即可开始打水
for(int i = 1; i < n; i++){
res += s[i];
}
cout << res << endl;
return 0;
}