HDU 1003 Max Sum 題解
阿新 • • 發佈:2018-12-16
由題意得:
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; }