UVA 11111 - Generalized Matrioshkas

来源:互联网 发布:遗传算法原理及应用 编辑:程序博客网 时间:2024/06/05 15:12

这道题目很简单,题意也很好理解~用到了栈来做,跟括号匹配的问题属于同一类问题。

不同之处在于,在这里需要多判一步看是不是内层的toy的size大于外层的size,如果大于,则是失败的。


RE许多次的原因不在于数组小,也不在于stack的位置,也不在于eof的不使用。

而是在于自己忽略了一种极端的情况:如果一开始就给了一个正数——那么stack本来就是空的,再要求stack往外弹,就会使程序崩溃。


在这里还是得谢谢川哥,是他帮我指出了这一点。


另外还教了我清空stack的办法~:

while(!k.empty())    k.pop();
很简单,但我一直没用过。


希望自己也能多积累一些经验,可以像川哥一样敏锐的发现错误的原因所在。

#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<stack>using namespace std;struct toy{    int Size;    int vol;}a[100000];int main(){    int temp;    char ch;    int t=0;int flag=0;    while(scanf("%d%c",&temp,&ch)!=EOF)    {        a[t].Size=temp;        a[t++].vol=temp;        if(ch=='\n')        {            flag=0;            stack<toy>k;            int i;            for(i=0;i<t;i++)            {                if(a[0].Size>0)                {                    flag=1;                    break;                }                if(i!=0&&k.size()==0)                {                    flag=1;                    break;                }                if(a[i].Size<0)                {                    if(i==0)                    {                        k.push(a[i]);                    }                    else                    {                        k.top().vol-=a[i].Size;                        if(k.top().vol>=0)                        {                            flag=1;                            break;                        }                        k.push(a[i]);                    }                }                else if(a[i].Size>0)                {                    int tt=k.top().Size;                    if(a[i].Size+tt!=0)                    {                        flag=1;                        break;                    }                    else                    {                        k.pop();                        continue;                    }                }            }            int ttt=k.size();            if(ttt!=0)                flag=1;            if(flag==1)                printf(":-( Try again.\n");            else                printf(":-) Matrioshka!\n");            t=0;        }    }    return 0;}


0 0