uva11111-一般Matrioshka

小白书里数据结构基础线性表的训练参考

题目链接 http://acm.hust.edu.cn/vjudge/problem/18905

解题思路

用栈维护。娃娃们有两种包含方式:一个套一个或者一个套多个。

遇到负数入栈,并更新包含它的娃娃的已转载的体积(如果有包含的话)。

遇到整数出栈。

超出尺寸,最后栈非空都是非法的。

输入的时候要忽略所有的空格。可以用getchar()、ungetc(),但可能会很恶心。。。

代码

#include<stdio.h>
//#define LOCAL
typedef struct node {
    int size;
    int tot;
}Node;
const int maxNum = 10000;
Node stack[maxNum];
int main()
{
    #ifdef LOCAL
        freopen("data.txt", "r", stdin);
        freopen("ans.txt", "w", stdout);
    #endif
    int d;
    int c;
    int top = -1;
    bool beat = false;
    while((c=getchar())==‘\n‘) printf(":-) Matrioshka!\n");
    ungetc(c, stdin);
    while(scanf("%d", &d) == 1) {
        if(d<0) {
            stack[++top].size = -d;
            stack[top].tot = 0;
            if(top>0) {
                stack[top-1].tot += -d;
                if(stack[top-1].tot >= stack[top-1].size) beat = true;
            }
        }
        if(d>0) {
            if(top==-1 || stack[top].size != d) beat = true;
            else if(stack[top].size > stack[top].tot) top--;
                else beat = true;
        }
        while((c=getchar())==‘ ‘) ;
        ungetc(c, stdin);
        if((c=getchar()) == ‘\n‘ && top != -1) { printf(":-( Try again.\n"); beat = false; top = -1; }
        else
            while(c==‘\n‘)
                { if(!beat) { printf(":-) Matrioshka!\n"); c=getchar(); }
                    else { printf(":-( Try again.\n"); beat = false; top = -1; c=getchar(); }
                }
        if(beat) {
            printf(":-( Try again.\n");
            while(c!=‘\n‘ && c!=EOF ) c = getchar() ;
            beat = false; top = -1;
        }
        if(c==EOF) break;
        ungetc(c, stdin);
    }
    return 0;
}
时间: 2024-10-12 21:10:10

uva11111-一般Matrioshka的相关文章

UVa 11111 一般Matrioshka 及 scanf 处理一行

题目:nest,嵌套 思路:思路想通了其实很简单:将负数压栈,遇到输入正数时,检查栈顶元素,如果栈顶是正数,则出栈,一直检查栈顶元素直到栈顶是负数,判断该数和栈顶负数是否为相反数,并判断出栈的那些正数之和是否小于该输入的正数(这个是满足题目中的相加小于m的条件).如果满足,则栈顶负数出栈,输入的正数入栈.这样循环到最后,如果一直匹配则最后栈中只剩一个元素.    思路很清晰,但实现起来比较麻烦,主要是EOF和\n的判断.我一直以为scanf是不能用来辨别一行的,因为它会跳过空白符.看了别人的一篇

ACM学习历程——UVA11111 Generalized Matrioshkas(栈)

Description Problem B - Generalized Matrioshkas   Problem B - Generalized Matrioshkas  Vladimir worked for years making matrioshkas, those nesting dolls that certainly represent truly Russian craft. A matrioshka is a doll that may be opened in two ha

UVA 11111-Generalized Matrioshkas(栈)

题意:有很多层盒子,盒子里面再套盒子,一个盒子可能套多个独立的子盒子,但子盒子的总体积必须小于该盒子,否则不合法,输入给一行数,负数代表左边,正数代表右边,大小表示其体积,如-2,-1,1,2则表示体积为2的盒子里套一个体积为1的盒子,再比如-5,-2,2,-1,1,5表示体积为5的盒子套两个盒子分别为2和1,题目要求判断给出的一行数是否合法.一定要保证子盒子的体积小于大盒子.比如-5,-4,4,-2,2,5就不合法. 解析:栈的使用,但同时维护另一个值,该盒子剩余能容纳的体积,比如该盒子的体积

Generalized Matrioshkas UVA 11111

说说: 题意就是一个大整数中包含几个小整数,且小整数的和要大于大整数.同时小整数中也可能包含其他小整数,依次类推.要求判断整个的包含关系是否正确.只是题目给的说明不是很清楚.首先给你一个序列,比如:-9     -7     -2    2     -3     -1     -2    2    1    3    7    9  其中9的范围就是-9到9之间,并且只包含了7.如果序列为-9 -7 7 -2 2 9 则9中就包含了7和2两个数字,显然这种情况是不合法的.解法的话,无非就是建立两

uva 11111 - Generalized Matrioshkas

  Problem B - Generalized Matrioshkas  Vladimir worked for years making matrioshkas, those nesting dolls that certainly represent truly Russian craft. A matrioshka is a doll that may be opened in two halves, so that one finds another doll inside. The