差分题

题意:

     港口有n堆货物,他们的重量分别为w1,w2,...wn,每堆货物的重量不一定相同。吊车师傅每次操作可以使任意第i堆到第j堆的货物都增加一个重量或者减少一个重量。请问吊车师傅最少需要执行几次操作可以使n堆货物重量都相同。

题的链接

思路:

     使得n堆货物都相同,就是让差分数组除了第一个元素,都为零。让i~j的元素都加上1,就是差分数组第i个元素加一,第 j+1 个元素减一。让i~j个元素都减一,则相反。

     让差分数组除第一个元素外,所有的元素都为零,就是对差分数组每一个元素(除了第一个)进行加减,正的减,负的就加,使之为零。每次的操作必须对两个元素进行(可以用第一个元素,因为最终的数组只需要元素相同,没有规定大小),一个加上数x,

一个减去x。无论怎么操作,一个元素要变为零的操作数是一样的,只需求出差分数组的所有正数的和,与差分数组所有负数的和,然后取最大值。

#pragma warning(disable:4996)
#include
#include
#include
#include
#include
#include
#include
#include
#include
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));

	}
}

 

你可能感兴趣的:(差分前缀和)