HDU 5783 Divide the Sequence
阿新 • • 發佈:2017-10-13
一段 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 intx; 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