因为就算每个人打水时间是1,总共等待时间T= 1 + 2 + 3 + 4 +…+ 99999 = (1e5)^2 / 2 = 50亿,但是int范围是20亿,会爆int!
使用公式 T = t1 * (n-1) + t2 * (n-2) + t3 * (n-3) + …+ tn * 0
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
int t[N];
int main (){
scanf("%d", &n);
for (int i = 0; i < n; i ++) {
scanf("%d", &t[i]);
}
sort(t, t + n);
LL res = 0, a = 0;
for (int i = 0; i < n; i ++) {
res += a;
a += t[i];
}
printf("%lld\n", res);
return 0;
}
使用公式求T:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
// 因为就算每个人打水时间是1,总共等待时间T= 1 + 2 + 3 + 4 +...+ 99999 = (1e5)^2 / 2 = 50亿,但是int范围是20亿,会爆int!
const int N = 1e5 + 10;
int n;
int t[N];
int main (){
scanf("%d", &n);
for (int i = 0; i < n; i ++) {
scanf("%d", &t[i]);
}
sort(t, t + n);
LL res = 0;
for (int i = 0; i < n; i ++) {
res += t[i] * (n - i - 1); //使用公式 T = t1 * (n-1) + t2 * (n-2) + t3 * (n-3) + ...+ tn * 0
}
printf("%lld\n", res);
return 0;
}
前缀和实现
//算法思想:1.先将输入的数组从小到大排列(贪心思想)
//2.求数组的前缀和,发现总共的等待时间刚好是前缀和的前n-1项的和。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
typedef long long LL;
int a[N],s[N];//s数组表示前缀和
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);//注意用sort排序时下标从1开始的时候对应传的参数要加1 !!!!!!!!!!!
for(int i=1;i<=n;i++) s[i]+=s[i-1]+a[i];
LL res=0;
//前缀和往前错一位刚好就是所有人的等待时间,也就是前n-1项的和。
for(int i=1;i<=n-1;i++) res+=s[i];
cout<<res;
return 0;
}
作者:满目星河_0
链接:https://www.acwing.com/solution/content/44027/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int n;
int t[N];
int s[N];
int main () {
scanf("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf("%d", &t[i]);
}
sort(t + 1, t + n + 1); // 必须+1, 因为下标从1开始
// for (int i = 1; i <= n; i ++) cout << t[i] << " ";
// puts("");
LL res = 0;
for (int i = 1; i <= n; i ++) s[i] = s[i - 1] + t[i]; //写成 += 也是对的
// for (int i = 0; i <= n; i ++) cout << s[i] << " ";
// puts("");
for (int i = 0; i <= n - 1; i ++) res += s[i];
printf("%lld\n", res);
return 0;
}