1. 程式人生 > >HDU 5783 Divide the Sequence

HDU 5783 Divide the Sequence

一段 type clas hdu 大於 pro 連續 php log

http://acm.split.hdu.edu.cn/showproblem.php?pid=5783

題意:
給出一段序列,現在要把它分成盡量多的連續序列,使得每一段序列之和都大於等於0。

思路:

做完之後去看別人的代碼都是從後往前掃一遍就好了。

我自己寫得稍微復雜了些吧,就是用棧來維護一下,分情況來進行入棧操作:

①如果第i個數為正數並且棧頂為正數,入棧。

②如果第i個數為正數並且棧頂為負數,將該數與棧頂值相加。

③如果第i個數為負數,與棧頂值相加,如果還是負的,繼續與棧頂的下一個值相加,直到棧頂值為正或只剩下一個值。

 1 #include<iostream>
 2
#include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<int
,int> pll; 14 const int INF = 0x3f3f3f3f; 15 const int maxn = 1e6 + 5; 16 17 int n; 18 int sta[maxn]; 19 20 int main() 21 { 22 //freopen("in.txt","r",stdin); 23 while(~scanf("%d",&n)) 24 { 25 int top=0; 26 for(int i=0;i<n;i++) 27 { 28 int
x; scanf("%d",&x); 29 if(top==0) sta[++top]=x; 30 else 31 { 32 if(x>=0) 33 { 34 if(sta[top]>=0) sta[++top]=x; 35 else sta[top]=sta[top]+x; 36 } 37 else 38 { 39 while(top) 40 { 41 sta[top]+=x; 42 if(sta[top]>=0) break; 43 x=sta[top]; 44 top--; 45 } 46 if(top==0 && x<0) sta[++top]=x; 47 } 48 } 49 } 50 printf("%d\n",top); 51 } 52 return 0; 53 }

HDU 5783 Divide the Sequence