计蒜客---线段的总长

数轴上有N个点,任意两点连线得到n(n-1)条线段,试求线段的总长。

输入格式:

第一行,一个整数N,表示点数。 接下来N行,每行一个整数X_i,表示点的坐标。

输出格式:

输出为一个整数,表示线段的总长。

N  < =  10000  ,  0  < =  X_i  < =  1000000000

样例输入

5
1
5
3
2
4

样例输出

40

题解:假如考虑一下算法,可以将要求变换成一个个相邻线段的和
…略…,对于排序好的n个点,得到n-1个线段,每个线程会重复i*(n-i)次
以n=5为例,有4条线段,长度分别是a、b、c、d,那么最终结果是 1*(5-1)*a + 2*(5-2)*b + 3*(5-3)*c + 4*(5-4)*d 再乘以2
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 bool cmp(int x,int y)
29 {
30     return x>y;
31 }
32 const int N=10005;
33 const int mod=1e9+7;
34 ll a[N];
35 int main(){
36     ll n, i;
37     cin >> n;
38     for(i=0;i<n;i++)
39         cin>>a[i];
40     sort(a,a+n);
41     ll res=0;
42     for(i=1;i<n;i++){
43         res +=(a[i]-a[i-1])*i*(n-i);
44     }
45     cout<<res*2<<endl;
46 }
原文地址:https://www.cnblogs.com/shixinzei/p/7281808.html