序列划分

题目描述

给定序列 A[1...N],将序列中的元素 A[i] 分为 2 部分(每部分必须连续,且可以为空),对划分的 2 部分分别统计:左边部分的元素总和 sum1​、右边部分的元素总和 sum2​。

请你求出 (sum1​−sum2​) 的最大值。

输入格式

第一行包含一个整数 N(1≤N≤106),代表序列的长度。

第二行包含 N 个整数 A[i](int 范围)。

输出格式

一个整数,代表 sum1​−sum2​ 的最大值。

样例 #1

样例输入 #1

3
1 0 -2

样例输出 #1

3

样例输入 #2

6
16 23 16 15 42 8

样例输出 #2

120

样例输入 #3

5
3 4 -3 2 -1

样例输出 #3

9

提示

样例 3 说明:sum1​=3+4=7,sum2​=(−3)+2+(−1)=−2

#include <iostream>
using namespace std;

long long s[1000010];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		s[i]+=s[i-1];
	}
	long long maxn=-1e18;
	for(int i=0;i<=n;i++)//左侧r
	{
		long long sum1=s[i],sum2=s[n]-s[i];
		maxn=max(maxn,sum1-sum2);
	}
	cout<<maxn;
	return 0;
}

这道题平均每次交四五次才能过T-T

这道题是前缀和,题目里如果有“连续”二字,就很可能是前缀和!

今天交了三遍过的,第一遍错了,改了两个long long;第二遍又错了,又改了一个long long。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值