第5期来啦!
这道题看上去没什么头绪,但其实没有那么难哦!
前排召唤阵:
@yhz012 @inuisanaa @ZERC @随性而为 @NianRuoshui
第5期 简单的排序题
Mr.K 018: 现在有一列数,从1到n,是乱序排列的,要对它排序。
Mr.K 019: 听上去不复杂啊,然后呢?
Mr.K 018: 你能使用的数据结构只有栈。队列啊,数组啊,堆啊什么的都不许用,只有栈。
Mr.K 019: 你等一下,栈是个啥?
插入科普:栈是个啥?
摘自百度百科:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。就是说,一个栈是*后进先出(Last In First Out, LIFO)*的。
可以把栈想象成一个装鞋盒的筒子。这个筒子很细,鞋盒只能放一排,因此每次只能取走最顶上的鞋盒,也只能把新的鞋盒放在最顶上。不过,倒是可以认为这个筒子很长,可以装很多很多鞋盒。
图5-1 堆栈及其操作示意
好的,我们继续。
Mr.K 018: 除此之外,我希望你用尽可能少的栈就完成这个任务。能用一个就不用两个。
Mr.K 019: 可是我根本不需要用栈啊,直接一口气把1到n输出不就完了么?
Mr.K 018: 呃不是的,这里其实是把一个其他什么数据元素表示成数字了。本来那个东西没准是份名单啊什么的,数字其实就是个id。不过那不重要。
Mr.K 018: 简单说,直接输出是不行的,必须排好序之后输出本来的那个东西才行。不过,输出了之后,那个数就可以不管了。
Mr.K 019: 啊,这……那我不会(直球
Mr.K 018: 我早就知道你不会,那降低一点要求吧。我给你这一列的数,你告诉我最少用几个栈就行,剩下的事情我来办。
Mr.K 019: 啊,这……
就算018已经降低了要求,019好像也还是不太会。现在他把这个问题抛给了各位,相信同盟的各位肯定能解决这个问题。
需要说明的是,不同的输入序列需要用到的最小栈数可能是不同的,请对每个输入序列分别计算。
输入
有多组测试用例,请读取到文件尾。
每组测试用例由两行组成。第一行是一个正整数n,满足1<=n<=10^5;第二行是一个1到n的排列,保证1到n的每个数都刚好出现一次。
输出
每个测试用例输出一行一个整数,表示对这n个数进行排序最少需要多少个栈。
样例输入
5
4 5 1 3 2
样例输出
2
输出解释
可以先把前三个数压入栈1,随后弹出栈1顶端的1.之后把3和2压入栈1后,依次弹出栈1顶端的2和3输出。此时,栈1中有4 5,栈2为空。将栈1顶端的5弹出并压入栈2,就可以弹出栈1顶端的4输出。再弹出栈2顶端的5输出,结束。