又是一道大水题,真心不大爱了。
题意:给你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; }