Test(4)

T1:栈排序2
(stack.cpp/in/out 1s 256M)
在上个题中,JJ发明了一种利用栈进行排序的方法。例如,当数组中的元素为1,3,2时,我们可以利用栈对其进行排序:1入栈;3入栈;3出栈;2入栈;2出栈;1出栈。在这个例子中,出栈序列是3,2,1,因而实现了对数组的排序。遗憾的是,在不打乱入栈顺序的前提下,有时仅仅 借助一个栈是不能实现对数组的完全排序。例如给定数组2,1,3,借助一个栈,能获得的字典序最大的出栈序列是3,1,2。(2入栈;1入栈;3入栈;3出栈;1出栈;2出栈)现请你借助一个栈,在不打乱入栈顺序的情况下,对数组进行从大到小排序。当无法完全排序时,请输出字典序最大的出栈序列。

输入
输入共2行。 第一行包含一个正整数n,表示入栈序列长度。 第二行包含n个整数,表示入栈序列。 输入数据保证给定的序列是1到n的全排列,即不会出现重复数字。 N≤10^6。

输出
输出仅一行,共n个整数,表示字典序最大的出栈序列

样例
输入
5
2 1 5 3 4
输出
5 4 3 1 2
提示
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈

T2:栈排序
(twostack.cpp/in/out 1s 256M)
JJ今天学习了栈,很开心。结合前几天学习的排序算法,他就想能不能用一个栈完成排序操作。也就是说给出一个进栈序列,经过一系列的进栈操作与出栈操作,得到一个升序排序的数列。例如进栈序列为3,2,1,则可通过以下几个操作得到出栈序列1,2,3. 首先将3压入栈,再将2压入栈,再将1压入栈。 然后再一个个弹出即可。 但他也很快发现一个栈可能是不足以完成这个任务的。例如进栈序列为2,3,1。他一怒之下,决定采用两个栈。现在规定有两个栈s1和s2. 定义如下四种操作 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1不为空,将S1栈顶元素弹出至输出序列 操作c 如果输入序列不为空,将第一个元素压入栈S2 操作d 如果栈S2不为空,将S2栈顶元素弹出至输出序列

如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,JJ就称P是一个“可栈排序排列”。例如(1,3,2,4)就是一个“可栈排序序列”,而(2,3,4,1)不是。

将(1,3,2,4)排序的操作序列:<a,c,c,b,a,d,d,b>

当然,这样的操作序列有可能有几个,对于上例(1,3,2,4),<a,c,c,b,a,d,d,b>是另外一个可行的操作序列。

JJ希望知道其中字典序最小的操作序列是什么

输入
第一行是一个整数n。 第二行有n个用空格隔开的正整数,构成一个1~n的排列。

输出
输出文件共一行,如果输入的排列不是“可栈排序排列”,输出数字0; 否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。

样例
输入复制
4
1 3 2 4
输出复制
a b a a b b a b
提示
样例用一个栈就搞定了,哎!

T3:热血战士
(war.cpp/in/out 1s 256M)
2020年,台海大战终于爆发,你做为特种部队的一员带着兄弟们头一批冲入台北市,可惜出师末捷身先死,你的好兄弟XXXX身中数弹,还未伤亡,但形势已经不妙,于是你——他的一个讲义气的“哥们儿”,准备去救他。假设地图是n*m的一个方块阵,地图上仅由楼房和街道组成,现在你在(x1,y1)点,他在(x2,y2)点,你可以向周围的8个方向移动,也可以爬上一部分楼房。而他因为受了伤,动弹不得。你所最担心的不是你的路程长短,而是你在救援中费的力气的大小。你爬上一幢高为H的楼房,或者从高为H的楼房房顶下来,都需要花费H的力气,而没有高度落差的行走是不费力的。现在你要完成救援的任务,最少要花费多少力气呢?费力最小的情况下,你最少又要走多少路呢?(上,下楼不算走路)这是一个很重要的问题,你决定抽2S的时间写个程序计算一下。

输入
文件的第1行有两个正整数n,m(n,m<=500),第2,3行分别是(x1,y1),(x2,y2)(1<=x1,x2<=n,1<=y1,y2<=m)。接下来有n行,每行m个数,第I行,第J列为1表示此处为空地,为2表示此处为房顶,为0表示此处无法攀爬。保证起点,终点不在0上,你可以假设可攀爬的楼房高度都为1。你到了(x2,y2)就表示救援成功

输出
包括两个在一行的数x,y,用一个空格隔开。X表示费力最少的情况下,路径的最短长度,Y表示最少花费的力气量。若不可能完成任务,输出’0 0’(引号不输出)。

样例
输入复制
3 7
1 1
3 7
2100212
2121010
2221012
输出复制
8 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值