您的位置:首页 > 移动开发 > IOS开发

UVa 11111 - Generalized Matrioshkas

2014-04-16 22:58 246 查看
题目链接: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: