这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??!

题意:给你一个n排列,求它们能不能通过双栈来完成排序。如果能输出最小字典序方案。

[update]这里面加了一个错误的剪枝。这是个假算法。

解:首先我们发现有一个策略,就是可以出栈的时候出栈,否则就在两个栈中选栈顶大于它且栈顶尽量小的那个入栈。如果这样还GG就无解。

但是这样不能保证字典序最小。因为入栈栈顶较小的可以保证决策包容性,但是可能你入另一个栈不会引起冲突。

于是想到搜索,T飞。

加上剪枝:如果先入的栈顶较小,那么不用入另一个栈。AC。

然后发现过不了hack数据:

5
2 4 1 3 5

这组数据在最后要先入栈5,再出栈4。

稍微调整一下搜索顺序就行了。AC。

  1 #include <cstdio>
  2 #include <algorithm>
  3
  4 const int N = 10010, INF = 0x3f3f3f3f;
  5
  6 int a[N], b[N], c[N], d[N], ta, tb, tc, td, p[N << 2], tp, n;
  7
  8 void DFS(int k) {
  9     /*
 10     printf("k = %d  tb = %d  tc = %d  td = %d \n", k, tb, tc, td);
 11     printf("b: ");
 12     for(int i = 1; i <= tb; i++) {
 13         printf("%d ", b[i]);
 14     }
 15     printf("\nc: ");
 16     for(int i = 1; i <= tc; i++) {
 17         printf("%d ", c[i]);
 18     }
 19     printf("\ned: ");
 20     printf("%d \n", td); */
 21
 22     if(td == n) {
 23         //
 24         for(int i = 1; i <= tp; i++) {
 25             putchar(p[i] + 'a' - 1);
 26             if(i < tp) {
 27                 putchar(' ');
 28             }
 29         }
 30         exit(0);
 31         return;
 32     }
 33     if(a[k] == d[td] + 1) {
 34         d[++td] = a[k];
 35         p[++tp] = 1;
 36         p[++tp] = 2;
 37         DFS(k + 1);
 38         td--;
 39         tp--;
 40         tp--;
 41         return;
 42     }
 43
 44     if(a[k] < b[tb] && k <= n) {
 45         b[++tb] = a[k];
 46         p[++tp] = 1;
 47         DFS(k + 1);
 48         tp--;
 49         tb--;
 50         if(b[tb] < c[tc]) {
 51             return;
 52         }
 53     }
 54
 55     if(b[tb] == d[td] + 1) {
 56         d[++td] = b[tb];
 57         tb--;
 58         p[++tp] = 2;
 59         DFS(k);
 60         tp--;
 61         b[++tb] = d[td];
 62         td--;
 63         return;
 64     }
 65
 66     if(a[k] < c[tc] && k <= n) {
 67         c[++tc] = a[k];
 68         p[++tp] = 3;
 69         DFS(k + 1);
 70         tp--;
 71         tc--;
 72         return;
 73     }
 74     if(c[tc] == d[td] + 1) {
 75         d[++td] = c[tc];
 76         tc--;
 77         p[++tp] = 4;
 78         DFS(k);
 79         tp--;
 80         c[++tc] = d[td];
 81         td--;
 82         return;
 83     }
 84
 85     return;
 86 }
 87
 88 int main() {
 89     scanf("%d", &n);
 90     for(int i = 1; i <= n; i++) {
 91         scanf("%d", &a[i]);
 92     }
 93
 94     b[0] = INF;
 95     c[0] = INF + 1;
 96
 97     DFS(1);
 98
 99     printf("0");
100     return 0;
101 }
102 /**
103 10
104 10 2 8 1 7 9 3 4 5 6
105
106 a a c a b b c a a b a b a b a b d d b b
107
108 */

AC代码

转载于:https://www.cnblogs.com/huyufeifei/p/9899544.html

洛谷P1155 双栈排序相关推荐

  1. 二分图——洛谷P1155 双栈排序

    https://daniu.luogu.org/problem/show?pid=1155 二分图染色+模拟 1.首先考虑一个简单情况--单栈排序,显然有这样的一个事实: a[i]和a[j] 不能压入 ...

  2. 洛谷——P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  3. P1155 双栈排序(二分图的染色判断+链式前向星)

    P1155 双栈排序 让字典序最小,当然尽量进S1 那什么时候必须进S2呢? a[i]和a[j] 不能压入同一个栈⇔存在一个k,使得i<j<k且a[k]<a[i]<a[j] 因 ...

  4. P1155 双栈排序(二分图染色)

    P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...

  5. P1155 双栈排序

    P1155 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S ...

  6. LOJ P1155 双栈排序 二分图染色 图论

    https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...

  7. AC日记——双栈排序 洛谷 P1155

    双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define ...

  8. NOIP2008 双栈排序

    https://www.luogu.org/problem/show?pid=1155 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输 ...

  9. 【每日一题】8月7日题目精讲—双栈排序

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

最新文章

  1. html页面在ie上出现404怎么解决,如何解决自定义404页面在IE等浏览器中无法显示问题...
  2. oracle创建简单的包
  3. c#调用c++的dll接口
  4. 手机html5性能测试工具,HTML5模块 性能方面8大测试环节_小米 M3_手机硬件频道-中关村在线...
  5. linux免密码登录ppk,【原创文章】通过WDCP生成密钥对免密码登录linux的方法
  6. python记录_day33 线程
  7. mtk平台耳机检测流程记录
  8. 《15款最好用的新浪短链接(t.cn接口)在线生成工具》
  9. 【Angular】Angular使用HTTP的GET/POST下载流文件
  10. ISP 图像信号处理器数字IP实现
  11. SiTime硅晶振 高性能MEMS时钟方案在5G中的应用
  12. 共轭方式怎么判断_有机化学中共轭体系的类型怎么判断
  13. 程序员的浪漫--词云kumo
  14. react 和 reflux
  15. Markdown 脚注 记录
  16. Unity 中实现擦除功能
  17. eva新世纪福音战士_【新世纪福音战士EVA合集】新世纪福音战士EVA游戏大全-ZOL游戏库...
  18. 木瓜移动:从KOL到内容营销,出海品牌如何争夺流量新战场
  19. wireshark网络安全分析工具之万文多图详解(持续更新)
  20. 假设有两名囚徒a和b python_囚徒问题(100 prisoners problem)的python验证

热门文章

  1. 以架构师的眼睛看世界-Architect Inside
  2. android string.xml中%1$s、%1$d等的用法
  3. shell 数学运算
  4. Animation插值器:解决Android Animation 循环执行的停顿问题
  5. 潘正磊谈微软研发团队管理和敏捷实践学习总结
  6. Springboot跨域 ajax jsonp请求
  7. [P2387魔法森林
  8. PHP基础入门(五)---PHP面向对象实用基础知识
  9. (原创)c#学习笔记05--变量的更多内容01--类型转换01--隐式转换
  10. office 2010中自带的 微软拼音输入法2010卸载