题目大意:给出一个长度为k的数列,求数列中的最大子段和。
思路:对于形如-1、0、0、-1、-1这样的数列来说,结果应该是0 0 0。即只有全为负数时,才会输出0和该数列的首位两个数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1e4+5;
int a[N];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int l=a[0],r,ansl=a[0],ansr=a[n-1],sum=0,ans=-1;
for(int i=0;i<n;i++){
sum+=a[i];
if(sum<0){
sum=0;
l=a[i+1];
}
else if(sum>ans){
ans=sum;
r=a[i];
ansl=l;
ansr=r;
}
}
ans=max(ans,0);
printf("%d %d %d\n",ans,ansl,ansr);
return 0;
}