题意及思路

题意:求一组序列中子序列的最大和(并输出其子序列的始末位置,下标从1开始)。

思路:暴力枚举(也不完全算),记录当前子序列的和,记录起始位置与末尾位置。下次遇到和大于ans的,更新ans。如果加到某个数时,发现前面的子序列被消灭了(即和为负数了),则下一次寻找的子序列的起始位置将从当前这个数的下一位开始。如此往复,关键点是已经记录下了上一次最大和的信息,如果未找到新的满足的最大和信息,则不更新,反之更新。

踩坑点:就是输出问题,如果有多组案例,每两个案例之间就多出一行空行,只有一组就不需要。


代码

#include <iostream>
#include <cstdio>

using namespace std;

const int MAXSIZE = 100005;
int arr[MAXSIZE];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    int n,lgt,t = 1;
    cin >> n;
    while(n--){
        if(t>1) printf("\n");
        int tmp_sum = 0, ans = -100000, start = 1, end = 1, f = 1;
        cin >> lgt;
        for(int i=1;i<=lgt;i++){
            cin >> arr[i];
            tmp_sum += arr[i];
            if(tmp_sum>ans){
                ans = tmp_sum;
                start = f;
                end = i;
            }
            if(tmp_sum<0){
                tmp_sum = 0;
                f = i+1;
            }
        }
        printf("Case %d:\n",t++);
        printf("%d %d %d\n",ans,start,end);
     }
    return 0;
}