- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NOIP2008提高组复赛题解I
第四题 双栈排序 问题描述: 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)
您可能关注的文档
- Ldy1p4明清之际活跃的儒家思想I.ppt
- lec09-狭义相对论I.ppt
- lect00LINUX概述I.ppt
- Lecture4克服翻译症I.ppt
- LDODC-DC型号大全I.ppt
- LCD各层功能介绍I.ppt
- lecture4英国人的性格英国节日英国与I.ppt
- Leajoy集团企业简介I.ppt
- Lecture5习语的翻译I.ppt
- lecture3《大学》英译赏析I.ppt
- 2025年化验员考前冲刺练习试题带答案详解(实用).docx
- 2025年化验员考前冲刺测试卷完美版附答案详解.docx
- 2025年化验员考前冲刺测试卷附答案详解(实用).docx
- 2025年化验员考前冲刺测试卷附完整答案详解(网校专用).docx
- 2025年化验员考前冲刺练习及答案详解【各地真题】.docx
- 2025年化验员考前冲刺测试卷(精华版)附答案详解.docx
- 2025年化验员考前冲刺测试卷附答案详解【巩固】.docx
- 2025年化验员考前冲刺测试卷【黄金题型】附答案详解.docx
- 2025年化验员考前冲刺测试卷含答案详解【模拟题】.docx
- 2025年化验员考前冲刺测试卷及参考答案详解【研优卷】.docx
文档评论(0)