题目描述:
有n(n<=100000)个元素的序列,元素值都在[-100,100]之间的整数数列,并从中找出最大累加和的子序列(在原数列中连续)。
输入格式:
第一行一个数n
第二行n个数
输出格式:
输出共三行
第一行最大的连续子序列和
第二行表示区间
第三行一个连续和最大的子序列
若有多个这样的子序列,输出最左边的
样例输入:
8 10 -20 6 8 10 -50 -10 16
样例输出:
24 3 5 6 8 10
提示:
n<=100000
子序列后面的0,不算在里面。
时间限制: 1000ms
空间限制: 128MB
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long a[100001],b[100001],c[100001];
int main(){
long long n,max=0,d,e;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
b[0]=a[0];
c[0]=1;
for(int i=1;i<n;i++){
if(b[i-1]>=0){
c[i]=c[i-1];
b[i]=a[i]+b[i-1];
}else{
c[i]=i+1;
b[i]=a[i];
}
if(b[i]>max){
max=b[i];
d=i+1;
e=c[i];
}
}
cout<<max<<endl;
cout<<e<<" "<<d<<endl;
for(int i=e-1;i<d;i++){
cout<<a[i]<<" ";
}
return 0;
}