|
11111 - Generalized Matrioshkas |
2642 |
34.25% |
742 |
87.60% |
題目連結接:
http://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=2052
題目類型: 資料結構, 鏈表
題目大意:
這題的題意比較難懂,看了好幾變才明白。 就是有一個可以嵌套娃娃的娃娃,然後嵌套在裡面的娃娃又可以繼續嵌套娃娃。
然後要求直接嵌套在裡面(內一層)的娃娃的尺寸大小之和不能超過外面的。 例如,-3 -2 2 3,代表有兩層,-3和3表示一個嵌套(這個娃娃的尺寸大小為3,且負數一定要在左邊先出現),裡面時-2和2表示一個大小2的娃娃。 再比如-5 -2 2 -1 1 5,表示有3個娃娃,5嵌套這2和1。當有更多層的嵌套時,如-9 -7
-2 2 -3 -2 -1 1 2 3 7 9,表示9嵌套著7.然後7又嵌套著2(左邊的-2,2)和3, 3又嵌套這2(右邊出現的-2,2), 這個2又嵌套著1。 只要相鄰的層次,內一層的大小相加起來小於(不能等於)外一層的大小就滿足條件。
解題思路:
這一題也和“括弧嵌套”有點像。 首先是題目的輸入,由於一開始沒有採用一個好的輸入方案,導致WA了無數次,浪費了幾個小時。 然後題目需要注意的一些地方:1.如果娃娃個數是奇數,則直接判斷錯誤; 2. 正數個數和負數不想等,也是錯誤的; 3.如果
正數先於對應的負數出現,也是錯誤的。
我採用的方法是,開一個數組level,用來儲存各個層次娃娃的容量,然後每次遇到一個‘)’時就進行處理, 把當前這個層次的”外層“容量減去這個層次的大小。 當有個層次為0或負數時,則可以判斷是錯誤的。最需要注意的是怎樣處理和判斷當前層次時哪一層。
範例輸入:
-9 -7 -2 2 -3 -2 -1 1 2 3 7 9-9 -7 -2 2 -3 -1 -2 2 1 3 7 9-9 -7 -2 2 -3 -1 -2 3 2 1 7 9-100 -50 -6 6 50 100-100 -50 -6 6 45 100-10 -5 -2 2 5 -4 -3 3 4 10-9 -5 -2 2 5 -4 -3 3 4 9
範例輸出:
:-) Matrioshka!:-( Try again.:-( Try again.:-) Matrioshka!:-( Try again.:-) Matrioshka!:-( Try again.
#include<cstdio>#include<iostream>#include<cstring>#include<stack>#include<cmath>using namespace std;string str;int level[30000], arr[30000], numDoll, cntNeg, cntPos, n; stack<int>st;bool solve(){ if(numDoll%2==1 || cntNeg!=cntPos) return false; int i,j,index=0; if(numDoll==2){ if(arr[0]<0 && arr[0]+arr[1]==0) return true; return false; } while(!st.empty()) st.pop(); for(i=0; i<numDoll; ++i){ if(arr[i]<0){ st.push(arr[i]); level[index++] = abs(arr[i]); } else if(arr[i]>0){ if(st.empty() || abs(st.top()) != arr[i]) return false; if(st.size()==1){ if(level[0] <=0 ) return false; st.pop(); } else{ st.pop(); --index; level[st.size()-1] -= arr[i]; if( level[st.size()-1] <= 0 ){ return false; } } } } return true;}void input(){ arr[0] = n; while(getchar()!='\n'){ scanf("%d",&arr[numDoll++]); }; }int main(){ freopen("input.txt","r",stdin); bool flag=true; cntNeg=0, cntPos=0; numDoll=1; while(~scanf("%d", &n)){ input(); if(solve()) printf(":-) Matrioshka!\n"); else printf(":-( Try again.\n"); cntNeg=0; cntPos=0; numDoll=1; } return 0;}
—— 生命的意義,在於賦予它意義。
原創 http://blog.csdn.net/shuangde800 , By
D_Double