• UVa 11111


    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2052

    题意:matrioshkas是一种可以嵌套的玩具娃娃,可嵌套的意思是大的玩具娃娃内部可以装一些小的玩具娃娃,如果用a和b代表两个这样的玩具娃娃,每个合法的嵌套必须满足:

    1. a的体积大于b的体积(玩具娃娃的体积都是正整数)

    2. a内部装下玩具娃娃的总体积严格小于a的体积,这里的总体积的计算只包含直接装在a内部的娃娃,而不包括这些娃娃内部的娃娃(多层嵌套)

    用如果一个玩具娃娃的体积为k,输入用-k k表示一个娃娃(负数总在前面),比如-2 -1 1 2表示一个体积为2的娃娃内部装了一个体积为1的娃娃。

    问题是输入一些整数序列,判断这个序列是否能代表一个合法的娃娃序列,如果是输出":-) Matrioshka!",否则输出":-) Matrioshka!",格式见样例。

    注意:-k k -k k 表示两个体积为k的娃娃,所以配对的规则是靠左优先配对。

    Sample Input 

    -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
    

    Sample Output 

    :-) Matrioshka!

    :-( Try again.

    :-( Try again.

    :-) Matrioshka!

    :-( Try again.

    :-) Matrioshka!

    :-( Try again.

    分析:
    1. 显然如果序列不是闭合的则不合法,这样可以用一个栈维护序列,遇到正数并配对(-k只与k配对)时弹出,遇到负数时压入2.

    2. 由于娃娃是嵌套的,为了判断是否满足上面两条嵌套规则,还要维护每一个娃娃内部第一层娃娃的总体积,这样仅维护一个变量是不够的(多层嵌套的情况),不过如果只考虑一层嵌套的情况,不难发现,也可以用一个栈来维护内部娃娃的总体积:当遇到一个子娃娃时,压入一个嵌套层的标志,当配对时,如果栈顶为标志则将栈顶修改为配对娃娃的体积,否则出栈直到遇到标志,并将栈顶修改为出栈的元素的和(子娃娃的体积和),这时就可以判断是否存在子娃娃体积和超出外层娃娃的体积。

    3. 注意读输入要用gets

  • 相关阅读:
    库函数(汇总)
    IE jQuery ajax 请求缓存问题
    Jarvis OJ-level3
    在64位的linux中运行32位的应用程序
    ROP之linux_x64知识杂记
    2017年网络空间安全技术大赛部分writeup
    Sniper OJ部分writeup
    gdb插件使用方法
    pwntools学习
    linux虚拟机安装值得注意的几点
  • 原文地址:https://www.cnblogs.com/txd0u/p/3669690.html
Copyright © 2020-2023  润新知