- 3
- 0
- 约1.07万字
- 约 37页
- 2019-09-16 发布于福建
- 举报
第四题 双栈排序 问题描述: Tom最近在研究一个有趣的排序问题。通过2个栈S1和s2,Tom希望借助以下4种操作实现将输入序列升序排序。 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1不为空,将Sl栈顶元素弹出至输出序列 操作c 如果输入序列不为空,将第一个元素压入栈s2 操作d 如果栈S2不为空,将S2栈顶元素弹出至输出序列 如果一个l~n的排列P可以通过一系列操作使得输出序列为l,2,…,(n-1),n,Tom就称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,b,a,a,b,b,a,b是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。 输入格式: 输入文件twostack.in的第一行是一个整数n。 第二行有n个刚空格隔开的正整数,构成一个1~n的排列。 输出格式: 输出文件twostack.out共一行,如果输入的排列不是“可双栈排序排列”,输出数字0; 否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。 数据规模: 30%的数据满足: n=10 50%的数据满足: n=50 100%的数据满足:n=1000 样例1输入: 4 1 3 2 4输出: a b a a b b a b 样例2输入: 4 2 3 4 1 输出: 0 样例3输入: 3 2 3 1输出: a c a b b d 分析: 输入的数据一定是1~n的整数且不会重复,因而对于给定的n,其排序后的序列一定是1,2,3,…,n。进一步可以推出两个栈中的元素一定是越靠近栈顶越小。 根据这种想法,我们可以制定一个贪心策略: 当输出序列中已有m个数时,在每次操作之前进行一次判断:如果数字m+1仍在输入序列中,那么本次操作一定入栈,当入栈的数不为m+1且该数比两个栈的栈顶元素都要大时无解,否则入栈(若两栈都能入则入1栈);如果m+1已在栈中则出栈,该元素必定在栈顶。 这种贪心可以通过全部数据,但是是错误的。对于这个输入序列:5?7?2?4?1?6?3,贪心所得出的操作序列并不是字典序最小的。 正确解法 首先要判断是否有解:设输入序列为S,S[i],S[j]两个元素不能进入同一个栈(自始至终不能进入同一个栈) = 存在k,满足ijk,使得S[k]S[i]S[j](证明略)。把每个元素按照输入序列中的顺序编号,看作一个图中的每个顶点。这时,我们对所有的(i,j)满足ij,判断是否满足上文结论,即S[i],S[j]两个元素能否进入同一个栈。如果满足,则在i,j之间连接一条边。由于只有两个栈,所以连完之后得到的图必须是二部图,否则无解。 动态规划优化 由于需要枚举i,j,k三个指针,时间复杂度为O(n^3)较大,这原因在于过多得枚举了k,我们可以用动态规划把枚举k变为O(1)的算法。 设F[i]为Min{S[i],S[i+1],S[i+2],…,S[n-1],S[n]},状态转移方程为F[i]=Min(S[i] , F[i+1])。 判断数对(i,j)是否满足条件,只需判断(ij且S[i]S[j] 且F[j+1]S[i])即可,时间复杂度为O(n^2) 。 染色模拟 接下来我们对图染色,由于由于要求字典序最小,即尽量要进入栈1,我们按编号递增的顺序从每个未染色的顶点开始染色,相邻的顶点染上不同的色,染色结束后我们就得到了每个元素所进的栈。 接下来进行模拟即可得到正确的解。 总结: 这道题虽然正确的解法不容易想到,但是较好的贪心策略亦可以拿到不少的分甚至拿满分,因此在比赛中遇到此类模拟题如果还有时间一定要试一试,搜索或者贪心都可能会过不少数据。 参考样程 #include fstream#define I_F twostack.in#define O_F twostack.outusing namespace std;int n;int s[1000],r[1001];??? //r记录每个元素所对应的编号int map[1000][1000]={{0}};??? //记录图(邻接表,map[i][0]记录与i相连的边数)short c[1000];??? //记录颜色(即每个元素所进的栈)char ans[2000];??? //操作序列bool flag=true;??? //记录是否有解void Input();int min(int a, int b)
您可能关注的文档
最近下载
- 半导体封装流程完整PPT课件.pptx VIP
- 四川省高职单招大纲英语词汇2500词音标素材.docx VIP
- 中国音乐史与名作欣赏 课件-第二十讲.ppt VIP
- 深圳市城市轨道交通第四期建设规划调整(2017-2022)》环境影响评价报告书.pdf VIP
- 扬职大2025单招试卷 .pdf VIP
- 清华大学微电子封装技术 外壳选择及封装设计基础.pdf VIP
- 2021-2025年高考数学真题 导数及其应用(解答题)8种常见考法归类(解析版).pdf
- 春节习俗的现代转变.pptx VIP
- Schneider Electric施耐德TeSys T LTMR 电机管理控制器 以太网通讯指南(中文).pdf
- 电缆网络图识读信号工程施工课件.pptx VIP
原创力文档

文档评论(0)