问题 G: 差值求和 (差分)

题目描述
小明最近学习了差的绝对值,|a-b|表示a-b的绝对值,若a-b>=0,则|a-b|=a-b;若a-b<0,则|a-b|=-(a-b)。
经过几次练习,小明已经熟练掌握了差的绝对值,现在他找来了N个整数,开始任意取出两个数,求差的绝对值,再将所有差的绝对值相加。例如N=4,有4个整数,分别是1,2,3,4。任取两个数有6种取法,|1-2|=1,|1-3|=2,|1-4|=3,|2-3|=1,|2-4|=2,|3-4|=1,它们的和就是10。
由于运算量太大,累坏了小明。请你写一个程序帮他计算一下吧。

输入
第一行一个整数n,表示有n个整数
第二行n个整数,表示小明写下的n个整数

输出
输出一个数,表示任意两数差的绝对值之和。
样例输入 Copy
【样例1】
3
3 1 2
【样例2】
4
1 2 3 4
样例输出 Copy
【样例1】
4
【样例2】
10
提示
样例1解释:|3-1|=2,|3-2|=1,|1-2|=1,答案为4

对于40%的数据,n<=1000,0<=每个数<=1000
对于70%的数据,输入数据保证第二行的n个数字从小到大有序。
对于100%的数据,n<=100000,0<=每个数<=1,000,000,000

差分就可以了

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll sum;
ll a[100010],f[100010];
int main()
{
    
    
    ll n;
    cin>>n;
    for(ll i = 1;i<=n;i++)
    cin>> a[i];
    sort(a+1,a+n+1);
    for(ll i = 2;i<=n;i++)
    f[i]=a[i]-a[i-1];
    ll temp=0,cnt=1;
    for(ll i = n;i>1;i--,cnt++)
    {
    
    
        temp+=f[i]*cnt;
        sum+=temp;
    }cout<<sum;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_51152918/article/details/113095577