標籤:
題意:有很多層盒子,盒子裡面再套盒子,一個盒子可能套多個獨立的子盒子,但子盒子的總體積必須小於該盒子,否則不合法,輸入給一行數,負數代表左邊,正數代表右邊,大小表示其體積,如-2,-1,1,2則表示體積為2的盒子裡套一個體積為1的盒子,再比如-5,-2,2,-1,1,5表示體積為5的盒子套兩個盒子分別為2和1,題目要求判斷給出的一行數是否合法。一定要保證子盒子的體積小於大盒子。比如-5,-4,4,-2,2,5就不合法。
解析:棧的使用,但同時維護另一個值,該盒子剩餘能容納的體積,比如該盒子的體積為5,已經有一個體積為3的盒子,減掉3後還剩2,如果還有子盒子,則子盒子的體積一定要小於2,否則不合法。
代碼如下:
#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<set>#include<map>#include<queue>#include<vector>#include<iterator>#include<utility>#include<sstream>#include<iostream>#include<cmath>#include<stack>using namespace std;const int INF=1000000007;const double eps=0.00000001;int go;int my_stack[40000],leave[40000],elem[40000]; //棧,leave[]代表該盒子剩餘容量bool solve(){ int rear=0; memset(leave,0,sizeof(leave)); leave[0]=INF; for(int i=0;i<go;i++) //掃一遍 { if(elem[i]<0) //小於0則添加到棧中 { rear++; my_stack[rear]=abs(elem[i]); leave[rear]=abs(elem[i]); //此時的leave[]就等於他的值 } else { if(rear==0) return false; //還未掃完就棧空 if(elem[i]!=my_stack[rear]) return false; //與棧頂元素不相同 if(elem[i]>=leave[rear-1]) return false; //大於或等於大盒子的leave[] leave[rear-1]-=elem[i]; //減掉 rear--; //出棧 } } return rear==0; //最後還要判斷是否棧空}int main(){ string line; while(getline(cin,line)) { istringstream output(line); //字串流輸入,這樣比較方便 int a; go=0; while(output>>a) { elem[go++]=a; } if(go%2){ printf(":-( Try again.\n"); continue; } //不是偶數肯定不合法 if(solve()) printf(":-) Matrioshka!\n"); else printf(":-( Try again.\n"); } return 0;}
UVA 11111-Generalized Matrioshkas(棧)