【NOJ2024】入栈序列和出栈序列
入栈序列和出栈序列
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:293 测试通过:68
比赛描述
给出入栈序列{A},保证{A}各个元素值各不相等,输出字典序最大的出栈序列.
如入栈序列{A} = 1, 2, 9, 4, 6, 5
则字典序最大的出栈序列为9, 6, 5, 4, 2, 1
输入
第一行一个整数n (1 <= n <= 100).
接下来是入栈序列{A}, n个正整数ai(0 < ai < 1000),且i != j则ai != aj.
输出
一行,字典序最大的出栈序列. 每个数字以空格分开。
样例输入
6
2 1 9 4 6 5
样例输出
9 6 5 4 1 2
提示
null
题目来源
NUPT
题目思路:
此题可转化为:使用一个队列(或栈,为了便于区分该数字序列与空栈,我们采用队列的叙述方式进行叙述)来表示初始数字序列,通过一个空栈辅助,输出最大字典序。
保证字典序最大,必须保证第一个数字为整个数列中最大的数字。
从该数字分开,前一段入栈,后一段留在数字序列中。
用栈顶元素 与 数字序列中数字最大值比较,若数字序列中值大,则不断从序列中出队数字压入栈中,后将该最大值输出;反之,则弹出栈顶元素。
如果采用扫描的方法找数字序列中的最大值,复杂度将为O(n^2)。
我们可以采用以下方法进行处理(最终算法):
1、初始化:
f[i]表示数字序列中第i个数往后所有数中最大的数。将数字序从后往前遍历,初始化f[i],f[1]即为最大值。
从该最大值分开,前一段入栈,后一段保留在数字序列中。
2、循环处理,直至全部输出:
1、边界:若栈空,则从数字序列中出队元素压入栈
2、边界:若数字序列空,弹出栈中所有元素
3、若栈顶元素大于等于f[head]:弹出栈顶
若栈顶元素小于f[head]:出队数字序列中的一个元素压入栈。
注意:NOJ不过滤多余的空格和换行符
代码如下:(代码凌乱,仅供参考)
#include<iostream>
#include<cstdio> int f[200];
int n; int num[200];
int head; int stack[200];
int top;
int size; int k,cnt; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
} f[n]=num[n];
num[0]=-9999999;
for(int i=n-1;i>=0;i--)
{
if(f[i+1]<num[i])
{
f[i]=num[i];
k=i;
}
else
{
f[i]=f[i+1];
}
} for(int i=1;i<=k-1;i++)
{
stack[++top]=num[i];
size++;
}
printf("%d ",num[k]);
cnt++;
head=k+1;
while(cnt!=n)
{
if(size==0)
{
size++;
stack[++top]=num[head++];
}
else if(head==n+1)
{
while(size!=0)
{
if(cnt==n-1)printf("%d",stack[top]);
else printf("%d ",stack[top]);
top--;
size--;
cnt++;
}
}
else
{
if(stack[top]>=f[head])
{
if(cnt==n-1)printf("%d",stack[top]);
else printf("%d ",stack[top]);
top--;
size--;
cnt++;
}
else
{
stack[++top]=num[head++];
size++;
}
}
}
return 0;
}
【NOJ2024】入栈序列和出栈序列的更多相关文章
- 写一个栈,实现出栈、入栈、求最小值,时间复杂度为O(1)
#-*-coding:utf-8-*- ''' 需求:写一个栈,实现出栈.入栈.求最小值,时间复杂度为O(1) 思路:通过两个栈实现,一个栈stack,一个辅助栈min_stack,记录stack中的 ...
- 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题
剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...
- Python 根据入栈顺利判定出栈顺序
1.读取入栈,出栈数据: 2.把数据分别转化成整数列表: 3.新建栈列表,用入栈数据进行压栈:如果栈列表不为空,并且栈顶层数据为出栈的元素:删除栈列表的顶层数据: 4.如果栈列表不为空,说明栈列表里面 ...
- 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是
技术之瞳 阿里巴巴技术笔试心得习题2.65: 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是(D) A.DEFCBA B.DCEFBA C.FEDCBA D.FECDBA E.ABCDEF ...
- 牛客网剑指offer第21题——判断出栈序列是否是入栈序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- SDUT-3334_数据结构实验之栈与队列七:出栈序列判定
数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...
- 基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列
题目
- C++中栈的出栈,入栈规则:A,B,C,D,E
考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前 栈中元素可以出栈,则出栈序列可能是_____a d___________. a. ABCED b. DBCEA c. CD ...
- n个元素的入栈顺序有多少种出栈顺序?
问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...
随机推荐
- git 命令行(三)-删除文件
在Git中,删除也是一个修改操作,我们实战一下,有一个多余的文件:src/common/Util2.js 我们需要删除这个文件, 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用 rm命令 ...
- UITableViewCell delete button 上有其它覆盖层
第一种解决办法: // Fix for iOS7, when backgroundView comes above "delete" button - (void)willTran ...
- myeclipse启动jboss报ERROR [MainDeployer] Could not create deployment
今天用myeclipse启动jboss时报了这样的错,花了我将近一天的时间去解决这个问题,开始以为jar包问题,到最后发现是配置错了,所以分享一下.具体报错信息如下图: ERROR [MainDepl ...
- linux下安装rabbitmq 集群
1.下载erlang官网地址 http://www.erlang.org/download 挑选合适的版本 然后 wget 比如目前18.3运行命令 wget http://erlang.org/do ...
- 用this 对方法的扩展
*都是静态方法 this指向的是调用的object*
- 解决element-ui表头错位的问题
经过测试得出: 使用element-ui的表格,并在table中设置固定height会出现表头错位的现象(不知道是什么bug) 解决方案: 将height改为max-height,设置固定高度为最大高 ...
- [NOI2003]逃学的小孩【观察+树的直径】
Online Judge:Bzoj1509,Luogu P4408 Label:观察,树的直径 题目描述 输入 第一行是两个整数N(\(3≤N≤200000\))和M,分别表示居住点总数和街道总数.以 ...
- 释放内存触发断点及数组、指针的NULL初始化
Visual Studio调试时,出现“触发一个断点”内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; char Outj ...
- python登录aspx网站
1.安装模块 2.准备aspx登录页面 3.示例代码 #coding:utf-8 import re from bs4 import BeautifulSoup import gzip import ...
- IIS首次发布VS2012创建的web应用程序时注册.net4.0
最近用VS2012创建的web应用程序,.net环境设置成了4.0,在用IIS发布的时候发现需要注册下.net4.0才能配置应用程序. 首先确保配置的电脑上已经安装了.net4,找到.net4所在文件 ...