1. 程式人生 > >HDU 1003 Max Sum 題解

HDU 1003 Max Sum 題解

由題意得:

1.輸入“t”,意為測試資料為t組

2.每組資料的第一個數“n”表示這組資料的數字個數為n

3.每組資料輸出三個數,第一個數為最大連續數列的和,後面兩個數分別表示該數列的起始位置與終止位置

4.程式碼如下:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int t,n,a[100010];
    int maxsum,thissum,begin,end,postion;
    cin>>t;
    for(int Case=1;Case<=t;Case++){
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        maxsum=thissum=a[0];//初始化結果與當前最大值為第一個數
        begin=end=postion=0;//初始化起始位置與終止位置
        for(int i=1;i<n;i++){
            if(thissum+a[i]<a[i]){//當前最大值+a[i]反而<a[i],意為當前最大值為負數
                thissum=a[i];//故當前最大值可捨去(加上也會是使結果更小),並將a[i]更新為當前最大值
                postion=i;//最大值的更新帶動起始位置的更新
            }
            else thissum+=a[i];

            if(thissum>maxsum){//若當前最大值>結果
                maxsum=thissum;//則將結果更新為當前最大值
                begin=postion;//更新 結果更新後 對應的起始位置
                end=i;//更新終止位置,因為可能不再出現當前最大值>結果的情況
            }
        }//輸出格式有點坑…… 注意一下 因為位置記錄的是陣列下標,所以輸出需要+1
        if(Case!=t) printf("Case %d:\n%d %d %d\n\n",Case,maxsum,begin+1,end+1);
        else printf("Case %d:\n%d %d %d\n",Case,maxsum,begin+1,end+1);
    }
    return 0;
}