差分题

题意:

     港口有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));

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值