uva 11111 - Generalized Matrioshkas

来源:互联网 发布:哑铃锻炼软件下载 编辑:程序博客网 时间:2024/06/05 03:50

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

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

然后要求直接嵌套在里面(内一层)的娃娃的尺寸大小之和不能超过外面的。 例如,-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 10000001int 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;}


 

原创粉丝点击