差异之和
差异之和
思路:显然n^2暴力枚举一定会超时,因为他们叫我们求的是绝对值之和,所以我们可以先把这些数排序,求前缀和,然后直接+当前值*(n-i)再减后面那些数的和(用前缀和算比较好)。
代码
#include<bits/stdc++.h>
using namespace std;
long long n,i,j,a[1000000],as[1000000],s;
bool cmp(int a,int b){
return a>b;
}
int main(){
scanf("%lld",&n);
for(i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+1+n,cmp);
for(i=1;i<=n;i++)as[i]+=as[i-1]+a[i];
for(i=1;i<=n;i++)
s+=abs(a[i]*(n-i)-(as[n]-as[i]));
printf("%lld",s);
return 0;
}