来源:牛客网

文章目录

  • 题目描述
  • 题意:
  • 题解:
  • 代码:
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

Tom最近在研究一个有趣的排序问题。如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序。

操作a:如果输入序列不为空,将第一个元素压入栈S1
操作b:如果栈S1不为空,将S1栈顶元素弹出至输出序列

操作c:如果输入序列不为空,将第一个元素压入栈S2

操作d:如果栈S2不为空,将S2栈顶元素弹出至输出序列

如果一个1~n的排列P可以通过一系列操作使得输出序列为1,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,c,c,b,a,d,d,b>是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。

输入描述:
第一行是一个整数n。
第二行有n个用空格隔开的正整数,构成一个1~n的排列
输出描述:
共一行,如果输入的排列不是“可双栈排序排列”,输出数字0;否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。
示例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

备注:

30%的数据满足:n<=10
50%的数据满足:n<=50
100%的数据满足:n<=1000

题意:

有四种操作,问如何操作可以实现将输入序列升序排序
四种操作分别是:
操作a:如果输入序列不为空,将第一个元素压入栈S1
操作b:如果栈S1不为空,将S1栈顶元素弹出至输出序列
操作c:如果输入序列不为空,将第一个元素压入栈S2
操作d:如果栈S2不为空,将S2栈顶元素弹出至输出序列

题解:

貌似二分图可以做(不过我还没看懂)
首先推出规律:

如果两个数 i,j(i≤j)i,j(i≤j) 不能被放入同一个栈中,当且仅当存在 k,k>jk,k>j, 且 q[k]<q[i]<q[j]q[k]<q[i]<q[j]。

现在有两个栈,我们只需要将满足这个条件的点各自归到一边,中间连一条线,用经典的染色法判断是否为二分图,若是则按照颜色入栈,
若不是则说明不能完成

代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cmath>
#define maxn 1004
using namespace std;const int inf=19260817;
int n,num;
int color[maxn];
int t[maxn];    //要排序的元素的存储
int s[maxn];    //判断两个数字是否满足规则
bool flag,e[maxn][maxn];void paint(int x,int c){    //DFS进行染色color[x]=c;for(int i=1;i<=n;i++){if(e[x][i]){    //查找相邻点 if(color[i]==c) flag=false;        //若相邻点颜色相同,则错误if(!color[i]) paint(i,3-c);        //若未染过色,对其染色,3-c结果为1,2,表示1与2号栈}}
}void make(){   //创造二分图s[n+1]=inf;    for(int i=n;i>=1;i--){s[i]=t[i];if(s[i+1]<s[i])s[i]=s[i+1];}for(int i=1;i<n;i++){for(int j=i+1;j<n;j++){if(t[i]<t[j] && s[j+1]<t[i]){e[i][j]=e[j][i]=1;  //按规则创建图}}}for(int i=1;i<=n;i++){ if(!color[i]){      //染色paint(i,1);}}
}void work(){if(flag==false){printf("0\n");return ;        }stack<int> stack1,stack2;int now=1;for(int i=1;i<=n;i++){if(color[i]==1){   //入栈stack1.push(t[i]);printf("a ");            }else {stack2.push(t[i]);printf("c ");               }while((!stack1.empty() && stack1.top()==now) || (!stack2.empty() && stack2.top()==now)){   //判断是否弹出if(!stack1.empty() && stack1.top()==now){stack1.pop();now++;printf("b ");}else{stack2.pop();now++;printf("d ");                }}}
}int main(){flag=1;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&t[i]);}make();work();   return 0;
}

【每日一题】8月7日题目精讲—双栈排序相关推荐

  1. 牛客网 每日一题 7月23日题目精讲—wpy的请求

    来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...

  2. 【每日一题】8月28日题目精讲 编号

    [每日一题]8月28日题目精讲 编号 链接:https://ac.nowcoder.com/acm/problem/19925 来源:牛客网 题目描述 你需要给一批商品编号,其中每个编号都是一个7位1 ...

  3. 【每日一题】7月17日题目精讲—BOWL 碗的叠放

    [每日一题]7月17日题目精讲-BOWL 碗的叠放 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...

  4. 【每日一题】7月15日题目精讲—生日快乐

    [每日一题]7月15日题目精讲-生日快乐 [SCOI2009]生日快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO For ...

  5. 【每日一题】7月13日题目精讲—Kingdom

    [每日一题]7月13日题目精讲-Kingdom 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bi ...

  6. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

  7. 【每日一题】5月7日题目精讲 「火」皇家烈焰

    链接: 「火」皇家烈焰 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: % ...

  8. 牛客网【每日一题】4月14日题目精讲 Xorto

    文章目录 题目描述 题解: 代码: 扩展 传送 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 ...

  9. 【每日一题】7月1日题目精讲 借教室

    来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 文章目录 题目描述 题解: 差分: 二 ...

最新文章

  1. java获取手机号码归属地_手机号码归属地能否取消?这些热点问题,工信部回复了...
  2. python【力扣LeetCode算法题库】9- 回文数
  3. SqlServer_Case_When用法
  4. js 从一个函数中传递值到另一个函数
  5. 使用JavaScript给对象修改注册监听器
  6. 「前端组件化」该怎么理解?
  7. STM32F103系统滴答计时器
  8. 数字图像处理(作业四)——边缘表达
  9. php字符不可选状态,php – mailto不可读的字符 – unicode
  10. mysql的半同步复制
  11. 抓包教程_最简单的Wireshark抓包TCP/UDP新手5步教程(宽带故障运维必备)
  12. 0930_C/C++笔试题_12:16道c语言面试【6/7】
  13. 【基本办公软件】万彩办公大师教程丨二维条码制作工具
  14. Altium net has no driving source问题
  15. PDFjs的使用说明书
  16. html5 自动矢量化,ArcScan自动矢量化
  17. openstreetmap-server-ubuntu-16-04+GraphHopper搭建离线地图服务器和离线路径规划
  18. 四川大学信息服务平台 ScuInfo网页 JSON数据解析
  19. 0001 2014蓝桥-练习 啤酒和饮料
  20. 2021年秋招面经分享·乐鑫【数字IC设计工程师】

热门文章

  1. 笑到打鸣~ | 今日趣图
  2. 国庆中秋活动——读完这两套书,宝宝就变小小物理学家了!
  3. linux 测试程序性能,推荐一款Linux系统的性能测试软件
  4. mysql 修改库的校对集_mysql数据库的基本操作(增删改查、字符集、校对集)
  5. startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...
  6. python3 csv读写_在python3中读取、更新和写入更新的CSV文件
  7. python检验阿姆斯特朗数_python 之九九乘法表,润年,奇偶数,阿姆斯特朗数判断分享...
  8. 同时画多个饼图_手帐术 | 这个神奇饼图里,藏着时间管理的小秘诀
  9. mysql必须的组件_mysql innodb的重要组件
  10. 计算机原理试题b,计算机组成原理试题B答案