题意:有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;
}

京公网安备 11010502036488号