【火车出栈】ZOJ - 2603 Railroad Sort
好久没写递归了,怕手生再来练练手。
题意:车轨上有上图所示的n个中转栈,现有2n个列车,给出列车初始编号序列。列车从最右边驶入车轨,并且列车只能从右向左移动,要求给出列车中转操作序列,使列车经过这n个中转栈后从最左端输出时满足1~2n的排列。
分析:其实这不就是火车出栈问题吗,可以用分治递归的思路,首先使一半有序,然后再合并使整体有序。
思路:具体来讲就是,一段无序的序列(编号1~2n),通过一个中转栈使1 ~ 2n-1在整个序列的前面2n-1+1 ~ 2n在整个序列的后面;再经过下一中转栈时,又能进一步进行排序,这样在最后一个中转栈是就只是两两之间的有序无序问题了。
什么都不如例子来的好使,比如n=3时,初始序列为 2 1 5 8 7 3 6 4
经过栈1时,使序列满足如下形式:2 1 3 4 | 6 7 8 5
经过栈2时,使序列满足如下形式:2 1 | 3 4 | 6 5 | 8 7
经过栈3时,使序列满足如下形式:1 2 | 3 4 | 5 6 | 7 8
然后就达到要求了。
那么该如何操作才能达到上述状态呢?
比如经过栈1时,可将序列分成包含(1~4)和(5~8)的两段子序列。那么每来一个数,判断该数是否大于4,若小于等于4,则该列车进栈接着出栈;否则该列车暂时停放在栈中,等所有小于等于4的列车出栈后再按照先进后出的性质出栈,这样就达到了目的;
经过栈1时的操作序列:2 2 1 1 5 8 7 3 3 6 4 4 6 7 8 5
经过下面的栈的情况就类似了,不再赘述了。
附代码:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <stack>
using namespace std;
const int maxn = ;
int a[maxn];
void dfs(int num[], int r, int k)
{
if(k <= ) return ;
int s1[k/ + ];
int s2[k/ + ];
int k1 = , k2 = k/;
int l = r-k;
int mid = (l + r)/; stack<int> si;
int p1, p2; p1 = p2 = ;
for(int i = ; i < k; i++)
{
if(num[i] <= mid)
{
s1[p1++] = num[i];
printf("%d %d ", num[i], num[i]);
}
else
{
printf("%d ", num[i]);
si.push(num[i]);
}
}
while(!si.empty())
{
s2[p2] = si.top();
printf("%d ", s2[p2++]);
si.pop();
}
dfs(s1, mid, k/);
dfs(s2, r, k/);
return ;
} int main()
{
int n;
while(~scanf("%d", &n) && n)
{
int m = <<n;
for(int i = ; i < m; i++)
scanf("%d", &a[i]);
dfs(a, m, m);
printf("\n");
}
return ;
}
【火车出栈】ZOJ - 2603 Railroad Sort的更多相关文章
- PAT线性结构_一元多项式求导、按给定步长反转链表、出栈序列存在性判断
02-线性结构1. 一元多项式求导 (25) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过100 ...
- BZOJ3772精神污染——可持久化线段树+出栈入栈序
题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...
- 出栈顺序 与 卡特兰数(Catalan)的关系
一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3 ,则出栈序列一共有五种,分别如下:1 2 3.1 3 2 ...
- CH1102 火车进出栈问题(高精/卡特兰数)
描述 一列火车n节车厢,依次编号为1,2,3,-,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 一个数,n(n<=60000) 输出格式 一个数s表示 ...
- POJ1363 Rails 验证出栈序列问题
题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ...
- 【讲●解】火车进出栈类问题 & 卡特兰数应用
火车进出栈类问题详讲 & 卡特兰数应用 引题:火车进出栈问题 [题目大意] 给定 \(1\)~\(N\) 这\(N\)个整数和一个大小无限的栈,每个数都要进栈并出栈一次.如果进栈的顺序为 \( ...
- luogu P1044 火车进出栈问题(Catalan数)
Catalan数就是魔法 火车进出栈问题即: 一个栈(无穷大)的进栈序列为 1,2,3,4,...,n 求有多少个不同的出栈序列? 将问题进行抽象, 假设'+'代表进栈, 则有'-'代表出栈 那么如果 ...
- 火车进出栈 java
题目描述 一列火车n节车厢,依次编号为1,2,3,…,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入 一个数,n(n<=60000) 输出 一个数s表示n节 ...
- N个数依次入栈,出栈顺序有多少种?
对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...
随机推荐
- 机器学习:集成学习(Soft Voting Classifier)
一.Hard Voting 与 Soft Voting 的对比 1)使用方式 voting = 'hard':表示最终决策方式为 Hard Voting Classifier: voting = 's ...
- Windows10:怎么安装whl文件
whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件.使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装.安装方法很简单,进入命令行输入pip instal ...
- java数组复制的几种常见用法
1.1数组复制的几种常见用法 1.1.1System.arraycopy的用法 int[] src = {1,3,5,7,9,11,13,15,17}; int[] dest = {2,4,6,8,1 ...
- 杂项:MIME(多用途互联网邮件扩展类型)百科
ylbtech-杂项:MIME(多用途互联网邮件扩展类型)百科 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用 ...
- SQL 从身份证号得到出生日期、年龄、男女
), CONVERT(smalldatetime, SUBSTRING(b.IDCard, , )), ) AS BrithDate_Name, DATEDIFF(year, CONVERT(smal ...
- CKEditor 自定义按钮插入服务端图片
CKEditor 富文本编辑器很好用,功能很强大,在加上支持服务端图片上传的CKFinder更是方便, 最近在使用CKFinder的时候发现存在很多问题,比如上传图片的时候,图片不能按时间降序排列,另 ...
- 执行: python manage.py makemigrations报AttributeError: 'str' object has no attribute 'decode'
找到错误代码(line146):query = query.encode(errors='replace') 解决方法:把decode改为encode即可.
- 初识python notes
python数据类型 数字 字符串 列表 元祖 字典 1.为什么要编程 编程的目的是解放人力,这就需要人通过编写程序的方式计算机代替人去自动干活 2.什么是编程语言 编程语言就是人与计算机之间沟通的介 ...
- C++深度解析教程学习笔记(1)C到C++的升级
1.现代软件产品架构图 比如商场收银系统 2.C 到 C++ 的升级 2.1变量的定义 C++中所有的变量都可以在需要使用时再定义,而 C 语言中的变量都必须在作用域开始位置定义. 2.2 regis ...
- Anaconda 安装教程(Win10环境) Tensorflow安装
序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.An ...