SOJ4478 Easy Problem II(模拟、栈)
Time Limit: 3000 MS Memory Limit: 131072 K
Description
在数据结构中 我们学习过 栈 这种数据结构
通过栈 我们可以将1,2,3,...,n转化成一个新的排列 举个例子
1,2,3可以转变为2,1,3
只要我们这样做
将1加入栈中
将2加入栈中
出栈(此时出栈的为2)
出栈(此时出栈的为1)
将3加入栈中
出栈(此时出栈的为3)
故出栈顺序为2 1 3 现在输入一个排列,我们要判断该排列能否被栈通过1,2,3,...,n 转化出来
Input
有多组数据
第一行为n 代表输入数据的组数
接下来n行 第一个数代表当前排列数字的个数m 接下来的数代表一个1-m的排列
(1 小于 m 小于等于 50)
Output
对于每一组数据
若该排列能通过栈转化1,2,3,...,n而来
那么输出Yes
否则输出No
Sample Input
4
3 2 1 3
2 2 1
5 3 2 4 1 5
3 3 1 2
Sample Output
Yes
Yes
Yes
No 思路:这一个题乍一看上去还是有一点蒙圈,因为很难使用现有的公式什么套用,如果DFS暴力去做,那么复杂度至少是在2^n的级别,面对n<=50的范围显然是不能接受的。所以在询问了大神以后确定这个题是一个模拟,我们只需要模拟栈的工作状态就可以把这个题做出来了。
具体而言,我的方法是记录当前输出过的最大的数,如果后续输入的数是符合栈的运算规律的,由于初始队列是严格单调连续递增的,所以后续一共有两种情况,一是新输入的数比现在已经输入过的数的最大值还要大,二是新输入的数是比当前最大值小的数中的最大的没有被输出过的数。
第一种情况是模拟了一次性压多个数入栈,之后再输出的情况,比如1 2 5 4 3。5比之前已经出现过的最大的数2要大,符合条件。第二种情况是模拟了,在将多个数压入栈以后,开始从栈里面拿出数输出的情况,比如前面的 1 2 5 4 3,当5输出以后,下一个输出的数是4和3的情况,因为初始状态下,数据是严格单调连续递增的,所以不会出现空过一个未输入最大值进行输出的情况。模拟即可。 AC代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std; int num[]; int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
cin>>n;
int maxn,temp,flag=;//maxn存储当前最大值,temp是为了临时存储每一次读入的数, flag是判断当前是否还处于合法输出状态
memset(num,,sizeof(num));//初始化
cin>>temp;//第一次单独处理
maxn=temp;
num[temp]++;
for(int i=;i<n;i++){
cin>>temp;
if(temp>maxn){
maxn=temp;
num[temp]++;
}
else{
for(int j=maxn;j>&&flag;j--){
if(num[j]==){
if(temp!=j){
flag=;
printf("No\n");
break;
}else{
num[temp]++;
break;
}
}
}
} }
if(flag==)printf("Yes\n");
}
return ;
}
SOJ4478 Easy Problem II(模拟、栈)的更多相关文章
- HDOJ/HDU 1022 Train Problem I(模拟栈)
Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...
- HDU 1022 Train Problem I 模拟栈题解
火车进站,模拟一个栈的操作,额外的栈操作,查看能否依照规定顺序出栈. 数据量非常少,故此题目非常easyAC. 直接使用数组模拟就好. #include <stdio.h> const i ...
- Train Problem I(模拟栈)
题意:模拟栈,试问使用2个栈,能否使得串1变为串2 思路:模拟,经典问题,注意只要相同的元素放到栈顶后就不会再移动了,只需要考虑剩下的元素,因此每次只考虑一个元素的进入方式. #include< ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- HDU1002 -A + B Problem II(大数a+b)
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 2055 An easy problem (java)
问题: 開始尝试用字符做数组元素.可是并没实用. 在推断语句时把a z排出了. An easy problem Time Limit: 1000/1000 MS (Java/Others) Me ...
- hdu2601 An easy problem(数学)
题目意思: http://acm.hdu.edu.cn/showproblem.php? pid=2601 给出一个数N,求N=i*j+i+j一共同拥有多少种方案. 题目分析: 此题直接暴力模拟就可以 ...
- A + B Problem II(大数加法)
http://acm.hdu.edu.cn/showproblem.php?pid=1002 A + B Problem II Time Limit: 2000/1000 MS (Java/Other ...
- HDU 1023 Train Problem II (大数卡特兰数)
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- KVC的特殊用法
- (id)valueForKeyPath:(NSString *)keyPath方法的强大用法,举个例子: NSArray *array = @[@"name", @" ...
- 获取IP相关信息和文件上传
获取IP相关信息 要获取用户访问者的IP地址相关信息,可以利用依赖注入,获取IHttpConnectionFeature的实例,从该实例上可以获取IP地址的相关信息,实例如下: var connect ...
- [转]oracle中查看用户权限
本文转自:http://www.cnblogs.com/QDuck/archive/2010/08/11/1797225.html 1.查看所有用户: select * from dba_user ...
- Expression Blend实例中文教程(3) - 布局控件快速入门Grid
上一篇对Blend 3开发界面进行了快速入门介绍,本篇将基于Blend 3介绍Silverlight控件.对于微软开发工具熟悉的朋友,相信您很快就熟悉Blend的开发界面和控件. XAML概述 Sil ...
- .net IoC 之 Spring.Net 适合刚开始使用
Spring.Net包括控制反转(IoC) 和面向切面(AOP),这篇文章主要说下IoC方面的入门. 一.首先建立一个MVC项目名称叫SpringDemo,然后用NuGet下载spring(我用的是S ...
- redis(9)集群搭建
一.搭建流程 以下我们将构建这样一个redis集群:三个主节点,分别备有一个从节点,主节点之间相互通信,如果主节点挂掉,从节点将被提升为主节点. redis集群至少需要3个redis实例 那么我们需要 ...
- redis(7)LRU缓存
一.LRU简介 LRU是Least Recently Used的缩写,即:最近最少使用. 它是内存管理中的一种页面置换算法,对于在内存中但是又不用的数据块,操作系统会根据哪些数据属于LRU而将其移除内 ...
- 十、集成使用redis
一.简介 redis是一种非关系型数据库,它的数据结构是key-value的存储形式:能够支持多种类型的数据存储,如:string/list/map/object...等.springboot自然也对 ...
- getElementsByName属性
getElementsByName() 方法可返回带有指定名称的对象的集合 语法 document.getElementsByName(name) 该方法与 getElementById() 方法相似 ...
- thrift简介
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl ...