Rails poj-1363

    题目大意:判断一个序列是否是1~n的合法出栈序列。

    注释:$1\le n\le 10^4$。

      想法:开始想到一种想法。

        对于一段序列来讲,显然从首元素开始的连续小于尾元素的序列必定为合法出栈序列,所剩下的数所组成的序列也必为合法出栈序列。

      黄色序列中所有数小于尾元素,不小于全序列最小值(废话),而且必定为全队最小值到尾元素-1的一个排列。绿色序列同理。

      然后,我们递归处理,先判断前面的黄色序列是否是合法的全排列,绿色序列是否是合法的全排列,然后递归处理。

      但是,EdwardFrog有一种更显然的方法。我们进行模拟:

        根据题目中的要求,如果当前第i个数小于等待进栈的数,显然它仍在栈里,如果栈首不是它,整个序列就是不合法的。反之,弹出。

                如果第i个数大于等待进栈的数,我们连续的进栈,使得它刚好是栈首,此时弹出。

        时间复杂度O(n)

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
int sta[1010];
int a[1010];
int head,k;
void original()
{
memset(sta,0,sizeof sta);
memset(a,0,sizeof a);
head=0;
k=1;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(!n) return 0;
// int n;
// cin >> n;
while(1)
{
original();
bool nxt=false;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)
{
nxt=true;
break;
}
}
if(nxt) break;
bool flag=true;
for(int i=1;i<=n;i++)
{
if(a[i]<k)
{
if(sta[head]!=a[i])
{
printf("No\n");
flag=false;
break;
}
else
{
head--;
continue;
}
}
else if(a[i]==k) k++;
else
{
while(k<=a[i])
{
sta[++head]=k;
k++;
}
head--;
}
}
if(flag)printf("Yes\n");
}
puts("");
}
return 0;
}

    小结:想到一个不可描述,但是觉得贼牛逼的做法时,不妨往简单想一想,毕竟所有的题目都是有简单的点构成的。

[poj1363]Rails_模拟_栈的更多相关文章

  1. Python模拟入栈出栈操作

    目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [ ...

  2. 简单用数组模拟顺序栈(c++版)适合新手

    **栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构. **今天我先记一下顺序存储结构,后面我会加上链式存储结构的. ...

  3. 简单用数组模拟顺序栈(c++)

    **栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构. **今天我先记一下顺序存储结构,后面我会加上链式存储结构的. ...

  4. POJ1363 Rails 验证出栈序列问题

    题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ...

  5. Codeforces 982 B. Bus of Characters(模拟一个栈)

    解题思路: 排序之后模拟一个栈(也可以用真的栈),时间复杂度o(n). 代码: #include <bits/stdc++.h> using namespace std; typedef ...

  6. php模拟顺序栈基本操作

    php模拟顺序栈基本操作 一.总结 写函数什么永远记住边界情况:比如 echo "栈已满!<br/>" ;  栈已空这种,那就能多考虑几种情况,代码就很正宗了 1.对象 ...

  7. java学习笔记(基础篇)—数组模拟实现栈

    栈的概念 先进后出策略(LIFO) 是一种基本数据结构 栈的分类有两种:1.静态栈(数组实现) 2.动态栈(链表实现) 栈的模型图如下: 需求分析 在编写代码之前,我习惯先对要实现的程序进行需求分析, ...

  8. 两队列模拟一个栈,python实现

    python实现两个队列模拟一个栈: class Queue(object): def __init__(self): self.stack1=[] self.stack2=[] def enqueu ...

  9. 【Weiss】【第03章】练习3.21:单数组模拟双栈

    [练习3.21] 编写仅用一个数组而实现两个栈的例程.除非数组的每一个单元都被使用,否则栈例程不能有溢出声明. Answer: 很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引. 如l ...

随机推荐

  1. thinkphp的model的where条件的两种形式

    thinkphp的model的where查询时有两种形式. $model->field('id')->where('customer_num is null or customer_num ...

  2. hdu5698瞬间移动(组合数,逆元)

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  3. 数塔问题mod 100(orz)

    看一下题目 和普通的数字三角形看似没啥区别(区别很大) 然后去想:DP方程 DP[i][j]=Max(DP[i-][j],DP[i-][j-])+a[i][j] ans=Max(DP[n][..n]) ...

  4. Unity学习-元素类型(三)

    在看下面操作时,先记住三句话 1.游戏对象 是由 组件 组成的:衣服 2.材质(Material):就是衣服的设计方案 3.纹理(Texture):做衣服的布料 从GameObject到Cube 第一 ...

  5. 研磨JavaScript系列(四):代码的时空

    对于过程式编程来说,代码执行的时间与数据标识的空间是密不可分的.我们只有把指令执行的具体时刻与标识映射的具体地址结合起来,才能确定程序在执行瞬间的上下文状态.于是,代码时刻与数据标识的结构,就形成了作 ...

  6. react杂记

    React webpack+react (hello world) 项目结构: src: app.js main.js package.json webpack_dev_config.js 需要安装包 ...

  7. checkbox与文字混排无法对齐到一行的解决办法

    直接上代码: <span><input style="vertical-align:middle" type="checkbox" name= ...

  8. LinearLayout中间布局填充出现的问题

    线性布局如何中间填充,会挤掉他下面的布局,所以中间填充使用layout_weight属性.

  9. Win32基础知识整理

    1.定义字符串 在资源新建String table,增加新字符串: (win32加载) TCHAR tcIDName[255]=_T(""); LoadString(hInstan ...

  10. jquery from使用

    jquery form是一个基于jquery的表单异步提交的插件,通过它能快速简便的提交表单. html <div> <form id="ajaxForm" me ...