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