这道题跟poj2231一样,只不过好像数据有加强。将给出的位置排序,然后递推各个位置的和,然后求总和。比如给出5 3 8 1 6 ,排序后1 3 5 6 8,比如5到6,距离为1,然而3到6,也可以分出来3到5和5到6两段,1到6能分成三段,都包含了5到6这段,所以看6前边有几个元素,乘以元素个数再加上1到5的这段和就是位置为(4)的和,如此递推出所有和,然后求出总和,最后结果为总和的二倍。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define llong long long
llong cow[11000],sum[11000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
sum[0]=0;
llong ans=0;
for(int i=0;i<n;i++)
scanf("%lld",&cow[i]);
sort(cow,cow+n);
for(int i=1;i<n;i++)
{
sum[i]=sum[i-1]+(cow[i]-cow[i-1])*i; //递推求到i位置时的单向和
ans+=sum[i]; //求总和
}
printf("%lld\n",ans*2); //还有逆向和
}
return 0;
}