思路:
原则是:用now表示当前的判断,在把多个元素加和的时候,若加到a[i]的时候小于0,那么舍去a[i],继续向后判断,设ans=-1记录最大值(设为-1的原因是要处理0开头的情况)
若sum==0那么我们不要(题上要求i,j最小),但如果第1个数是0那么就要
用tleft表示临时的左节点,当ans>now的时候更新left=tleft,right=a[i]
最后判断一下全负的情况
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
const int N=10005;
int a[N];
int main(){
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&a[i]);
}
int ans=-1,now=0,tleft=1,left,right;
for(int i=1;i<=k;i++){
now+=a[i];
if(now>ans){
ans=now;
left=tleft;
right=i;
}
else if(now<0){
now=0;
tleft=i+1;
}
}
if(ans<0){left=1;right=k;ans=0;}
printf("%d %d %d\n",ans,a[left],a[right]);
}