题目描述
给定序列 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。