UVa 1111 Generalized Matrioshkas 資料結構專題

來源:互聯網
上載者:User
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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.