题意:有n个物品,每个物品重w[i],每一次操作可以将[l,r]区间的物品重量加一或减一。求最少多少次操作可以使每一个物品重量相等?

思路:差分,每一个操作作用于差分数组为一个数加一一个数减一,第一个数与第0个数的差和第n个数与第n+1个数的差用于调节,所以只需计算第2个数到第n个数与它前一个数的差按正负相加,最后结果为正数和与负数和的相反数的最大值。
注意:数据可以超出int,所以请用longlong;

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 1000000007

using namespace std;

ll a[100005], d[100005];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        d[i]=a[i]-a[i-1];
    }
    ll zhe=0, fu=0;
    for(int i=2;i<=n;i++)
    {
        if(d[i]>0)
        {
            zhe+=d[i];
        }
        else
        {
            fu+=d[i];
        }
    }
    ll z=max(zhe,-fu);
    printf("%lld\n",z);
    return 0;
}