魔卡少女樱CLEAR CARD篇,小樱都上初中了,她说要好好学数学。她有一道作业题是这样的:给你一个数列,要你写出其一个子数列,这个子数列的要求是连续且和最大,如果有多条子数列和一样大就取最前面的一条。
例如,对于数列(-5,6,-1,5,4,-7),就取第2位到第5位这一段,总和为:6 + (-1) + 5 + 4 = 14即是总和最大的一段。

Input输入数据的第一行是一个整数T(1<=T<=20)表示测试实例的个数,然后是T行数据,每一行的开始是一个整数N(1<=N<=100000),然后是N个整数(-1000<=0<=1000).
Output对于每个测试实例,你要输出两行,第一行是"Case #:",#是第#组数据的意思,第二行包含三个整数,最大子数列和,子数列的起始位置,子数列的结束位置。
注意每两组测试样例之间有一个空行。
Sample Input

2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5

Sample OutputCase 1:

14 1 4

Case 2:
7 1 6

思考这道题目时,需要将数据考虑完全
1)题目所给普通数据
2)当其中遇到断点,对初始位置的定位
3)当所有数据都为负数时例
#include<iostream>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main()
{
    int t,n;
    int sum;
    int x=1;
    int st,k;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
           cin>>a[i];
        int max=-99999;
        int s=1;//开始 
        sum=0;
        for(int i=1;i<=n;i++)
        {
            sum+=a[i];
            if(sum>max)
            {
                max=sum;
                k=i;
                st=s;
            }
            if(sum<0)//若和小于0,说明负值大,舍去这一段,继续重新开始 
            {
                sum=0;
                s=i+1;
            }
        }
        if(x!=1)cout<<endl;
        cout<<"Case "<<x<<":"<<endl;
        cout<<max<<" "<<st<<" "<<k<<endl;
        x++;
    }
    return 0;
}
02-10 02:07