又是一道大水题,真心不大爱了。
题意:给你n个数,让你求它们之间差值的绝对值的和(ai aj 与 aj ai算作2种),求这个值明显与顺序无关,所以可以将其排成从小到大的顺序。依次求过去,但是除了第一次需要遍历之外,其余的数都可以根据上一次推倒过来,*2先别着急,之前乘2只会浪费时间,等到最后统一乘2.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10001;
int n;
long long sum,arr[N];
int main(void)
{
while(cin>>n)
{
sum = 0;
for(int i=1;i<=n;++i)
scanf("%d",arr+i);
sort(arr+1,arr+n+1);
long long tmp = 0;
for(int i=2;i<=n;++i)
{
tmp += (arr[i]-arr[1]);
}
sum += tmp;
for(int i=2;i<n;++i)
{
tmp = tmp - (arr[i]-arr[i-1])*(n-i+1);
sum += tmp;
}
sum *= 2;
cout<<sum<<endl;
}
return 0;
}