题目链接: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