题意:
港口有n堆货物,他们的重量分别为w1,w2,...wn,每堆货物的重量不一定相同。吊车师傅每次操作可以使任意第i堆到第j堆的货物都增加一个重量或者减少一个重量。请问吊车师傅最少需要执行几次操作可以使n堆货物重量都相同。
思路:
使得n堆货物都相同,就是让差分数组除了第一个元素,都为零。让i~j的元素都加上1,就是差分数组第i个元素加一,第 j+1 个元素减一。让i~j个元素都减一,则相反。
让差分数组除第一个元素外,所有的元素都为零,就是对差分数组每一个元素(除了第一个)进行加减,正的减,负的就加,使之为零。每次的操作必须对两个元素进行(可以用第一个元素,因为最终的数组只需要元素相同,没有规定大小),一个加上数x,
一个减去x。无论怎么操作,一个元素要变为零的操作数是一样的,只需求出差分数组的所有正数的和,与差分数组所有负数的和,然后取最大值。
#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
ll a[1000005], b[1000005];
int main()
{
ll i, j, n, ans, cnt;
while (scanf("%lld", &n) == 1)
{
for (i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
b[1] = a[1];
for (i = 2; i <= n; i++)
{
b[i] = a[i] - a[i - 1];
}
ans = 0; cnt = 0;
for (i = 2; i <= n; i++)
{
if (b[i] < 0)ans -= b[i];
else cnt += b[i];
}
printf("%lld\n", max(cnt, ans));
}
}