再見HDU1003

 

題意及思路

題意:求一組序列中子序列的最大和(並輸出其子序列的始末位置,下標從1開始)。ios

思路:暴力枚舉(也不徹底算),記錄當前子序列的和,記錄起始位置與末尾位置。下次遇到和大於ans的,更新ans。若是加到某個數時,發現前面的子序列被消滅了(即和爲負數了),則下一次尋找的子序列的起始位置將從當前這個數的下一位開始。如此往復,關鍵點是已經記錄下了上一次最大和的信息,若是未找到新的知足的最大和信息,則不更新,反之更新。spa

踩坑點:就是輸出問題,若是有多組案例,每兩個案例之間就多出一行空行,只有一組就不須要。code

 

代碼

#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;
}
相關文章
相關標籤/搜索