uva 11111 - Generalized Matrioshkas

这个题意难懂,看了好多遍

就是有一个可以嵌套娃娃的娃娃,然后嵌套在里面的娃娃又可以继续嵌套娃娃。

然后要求直接嵌套在里面(内一层)的娃娃的尺寸大小之和不能超过外面的。 例如,-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。 只要相邻的层次,内一层的大小相加起来小于(不能等于)外一层的大小就满足条件。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <stack>
using namespace std;
#define N 10000001

int a[N],cnt;
int solve()
{
    stack<int> s,sum;
    for(int i = 0; i < cnt; i++)
    {
        if(a[i]<0)
        {
            if(s.size()>=1)
            {
                if(sum.top()<=abs(a[i]))
                    return 0;
                int tmp = sum.top();
                tmp-=abs(a[i]);
                sum.pop(); sum.push(tmp);
            }
            s.push(a[i]);
            sum.push(abs(a[i]));
        }
        else
        {
            if(s.empty())
                return 0;
            if(abs(s.top())!=a[i])
                return 0;
            s.pop();
            sum.pop();
        }
    }
    return 1;
}
int main()
{
    cnt = 0;
    int b;char c;
    while(~scanf("%d%c", &b, &c))
    {
        a[cnt++] = b;
        if(c=='\n')
        {
            if(cnt%2)
                printf(":-( Try again.\n");
            else
            {
                int flag = solve();
                if(flag)
                    printf(":-) Matrioshka!\n");
                else
                    printf(":-( Try again.\n");
            }
            cnt = 0;
        }
    }

    return 0;
}



 

你可能感兴趣的:(uva 11111 - Generalized Matrioshkas)