洛谷P1155 双栈排序
这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??!
题意:给你一个n排列,求它们能不能通过双栈来完成排序。如果能输出最小字典序方案。
[update]这里面加了一个错误的剪枝。这是个假算法。
解:首先我们发现有一个策略,就是可以出栈的时候出栈,否则就在两个栈中选栈顶大于它且栈顶尽量小的那个入栈。如果这样还GG就无解。
但是这样不能保证字典序最小。因为入栈栈顶较小的可以保证决策包容性,但是可能你入另一个栈不会引起冲突。
于是想到搜索,T飞。
加上剪枝:如果先入的栈顶较小,那么不用入另一个栈。AC。
然后发现过不了hack数据:
这组数据在最后要先入栈5,再出栈4。
稍微调整一下搜索顺序就行了。AC。
#include <cstdio>
#include <algorithm> const int N = , INF = 0x3f3f3f3f; int a[N], b[N], c[N], d[N], ta, tb, tc, td, p[N << ], tp, n; void DFS(int k) {
/*
printf("k = %d tb = %d tc = %d td = %d \n", k, tb, tc, td);
printf("b: ");
for(int i = 1; i <= tb; i++) {
printf("%d ", b[i]);
}
printf("\nc: ");
for(int i = 1; i <= tc; i++) {
printf("%d ", c[i]);
}
printf("\ned: ");
printf("%d \n", td); */ if(td == n) {
//
for(int i = ; i <= tp; i++) {
putchar(p[i] + 'a' - );
if(i < tp) {
putchar(' ');
}
}
exit();
return;
}
if(a[k] == d[td] + ) {
d[++td] = a[k];
p[++tp] = ;
p[++tp] = ;
DFS(k + );
td--;
tp--;
tp--;
return;
} if(a[k] < b[tb] && k <= n) {
b[++tb] = a[k];
p[++tp] = ;
DFS(k + );
tp--;
tb--;
if(b[tb] < c[tc]) {
return;
}
} if(b[tb] == d[td] + ) {
d[++td] = b[tb];
tb--;
p[++tp] = ;
DFS(k);
tp--;
b[++tb] = d[td];
td--;
return;
} if(a[k] < c[tc] && k <= n) {
c[++tc] = a[k];
p[++tp] = ;
DFS(k + );
tp--;
tc--;
return;
}
if(c[tc] == d[td] + ) {
d[++td] = c[tc];
tc--;
p[++tp] = ;
DFS(k);
tp--;
c[++tc] = d[td];
td--;
return;
} return;
} int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
} b[] = INF;
c[] = INF + ; DFS(); printf("");
return ;
}
/**
10
10 2 8 1 7 9 3 4 5 6 a a c a b b c a a b a b a b a b d d b b */
AC代码
洛谷P1155 双栈排序的更多相关文章
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 洛谷P1155 双栈排序——思路题
题目:https://www.luogu.org/problemnew/show/P1155 思路... 看博客:https://www.cnblogs.com/Narh/p/9213825.html ...
- 洛谷 P1155 双栈排序
题面 解题思路 这道题乍一看还以为是个模拟..怒写一发30分(noip提高组t4有模拟吗?). 其实很好hack,如 10 10 2 8 1 7 9 3 4 5 6 按模拟的思路,应该是10入第一个栈 ...
- 洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作aaa 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果 ...
随机推荐
- 20155211 网络对抗 Exp9 Web安全基础实践
20155211 网络对抗 Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语 ...
- Spring-data-jpa 学习笔记(二)
通过上一篇笔记的,我们掌握了SpringData的相关概念及简单的用法.但上一篇笔记主要讲的是Dao层接口直接继承Repository接口,然后再自己定义方法.主要阐述了自定义方法时的 ...
- Latex数学公式编写
小叙闲言 一直想用latex来编辑文档,但是没有需求,所以也没有去学习一下,但是最近由于要大量敲数学公式,有了latex数学公式的需求,所以来稍稍总结学习一下 1.在MathType中编写Latex数 ...
- 如何查看哪个进程,使用了哪个CPU
某些时候,我们需要知道,在Unix/Linux 环境中,CPU究竟消耗在了哪些进程上面. 如下是最简单的方法: ps -elF
- Python中类和对象在内存中是如何保存?
类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...
- Macaca之Android原理浅析
经过研究macaca的android模块源码,原理主要由以下三块构成 一.uiautomator TODO 二.nanohttp TODO 二.adb forward TODO
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和 ...
- HTML 脚本 (Script) 实例
1.JavaScript 使 HTML 页面具有更强的动态和交互性.HTML script 元素<script> 标签用于定义客户端脚本,比如 JavaScript. script 元素既 ...
- Accer 4752G添加固态硬盘 双系统
(此文一直在草稿箱里躺了一年,略作修改后发布~) 背景:电脑是2011年年末买的,用到现在也已经5年多了,好在没坏过什么硬件,有过2年疯狂打LOL的经历,之后电脑就打不动了,FPS始终上不去,启动游戏 ...
- 一种C#泛型方法在lua中表示的设计
在进行lua方法注册的时候, 大多数解决方案直接否定了泛型方法, 因为在lua侧难以表达出泛型, 以及lua的函数重载问题, 函数重载问题可以通过一些特殊方法解决, 而泛型问题是主要问题, 以Unit ...