以及最大子序列的第一个和最后一个数字。
输入:
每个输入文件包含一个测试用例。每个箱子占两行。第一行包含一个正整数K(≤10000)。第二行包含K个数字,用空格分隔。
输出:
对于每个测试用例,在一行中输出最大和,以及最大子序列的第一个和最后一个数字。数字之间必须用一个空格隔开,但行尾不能有额外的空格。如果最大子序列不是唯一的,则输出索引i和j最小的子序列(如示例情况所示)。如果所有K个数字都是负的,那么它的最大和被定义为0,并且你应该输出整个序列的第一个和最后一个数字。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+1;
int k,seq[N];
void MaxSubseqSum(int a[],int n){
int MaxSum=-1,ThisSum=0;
int l=0,r=n-1,tmpl=0;
for(int i=0;i<n;i++){
ThisSum+=a[i];
if(MaxSum<ThisSum){
MaxSum=ThisSum;
r=i;
l=tmpl;
}
if(ThisSum<0){
ThisSum=0;
tmpl=i+1;
}
}
if(MaxSum>=0)
cout<<MaxSum<<" "<<a[l]<<" "<<a[r];
else
cout<<0<<" "<<a[0]<<" "<<a[n-1];
}
int main(){
cin>>k;
for(int i=0;i<k;i++){
cin>>seq[i];
}
MaxSubseqSum(seq,k);
return 0;
}