大牛的距离(笑cry)精简算法

在一条数轴上有N头牛在不同的位置上,每头牛都计算到其它各头牛的距离。求这n*(n-1)个距离的总和。1<= N <= 10000。每头牛所在位置是一个范围在0到1,000,000,000之内的整数。

/***********************************************************************

此题坑在取值上,10000个数,超过了二次循环的范围,但这里的二次循环是指从一开始的循环,所以思路如下

输入数组之后,对数组进行排序

例:

1 2 3 6 9
1:1-1 2-1 3-1 6-1 9-1
2:2-1 2-2 3-2 6-2 9-2
3:3-1 3-2 3-3 6-3 9-3
6:6-1 6-2 6-3 6-6 9-6
9:9-1 9-2 9-3 9-6 9-9

注意,排过序后,再次计算距离就会有0之后的数(即红字之后的数)这些数在下面一定有对应的数,这些数无需再次计算,乘二即可。

所以二次循环可用

代码实现如下:


#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
long long m,n,p,q,a[26666],sum=0;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
}
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)
{
for(int j=i;j<=m;j++)
{
p=a[i]-a[j];
p=p*-1;
sum=sum+p;
}
}
cout<<sum*2<<endl;
}
return 0;
}
原文地址:https://www.cnblogs.com/supersumax/p/5882472.html