题目描述
给定整数序列A1,A2,…,An,对其所有连续子序列求和,寻找累加和最大的序列。如果所有的整数都是负的,那么最大连续子序列的和为0。
输入格式
输入包括多组测试数据,每组测试数据一行,每行第一个为正整数n(0 < n <= 100000),表示序列长度,紧跟着n个整数,Ai
(-1001<Ai < 1001),表示序列每个元素,各个整数之间用空格隔开。
输出格式
针对每组测试数据,输出最大连续子序列的和,以及该最大连续子序列的起止位置。当最大连续子序列的长度为0时,序列的起止位置都输出为-1。如果有多个连续子序列的值为最大值,输出第一个连续子序列。
多组输出用换行隔开
输入样例 复制
6 -2 11 -4 13 -5 2
1 -1
输出样例 复制
20 1 3
0 -1 -1
#include <iostream>
#include<cmath>
#define ll long long
using namespace std;
const int Max=1e5+5;
int a[Max];
int main()
{
int n;
while(cin>>n){
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int maxsum,maxhere;
maxsum=maxhere=a[0];
int beg=0,end=0,newbeg=0;
for(int i=1;i<n;i++){
if(maxhere<=0){//目前sum<=0时换新开头
maxhere=a[i];
newbeg=i;
}
else {
maxhere+=a[i];
}
if(maxhere>maxsum){
maxsum=maxhere;//记录最大值以及首尾下标
beg=newbeg;
end=i;
}
}
if(maxsum<=0)printf("0 -1 -1\n");
else printf("%d %d %d\n",maxsum,beg,end);
}
return 0;
}