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) ...
随机推荐
- Linux 信号signal处理函数--转
alarm(设置信号传送闹钟)相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int ...
- Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback
Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback 上一篇# Linux Kernel文件系统写I/O流程代码分析(一),我们看到Buffered IO,写操作写入到 ...
- 在web应用中使用文件
使用HTML5 DOM新增的File API,现在可以让网页要求用户选择本地文件,并且读取这些文件的信息了.选择的方式既可以是HTML<input> 元素,也可以是拖拽 . 你可以在chr ...
- PostgreSQL PARTITION 分区表
PostgreSQL 分区表,操作性相当便捷. 但只能在创建时决定是否为分区表,并决定分区条件字段,普通表创建后,不能在修改为分区表. Note:通过其他方法也可转化为分区表. 和其他数据库一样,分区 ...
- 同步ajax请求
/* * 发送同步ajax请求的函数 CreateBy 秋水 */ function syncAjax(data) { var resp = null; $.ajax({ type : "P ...
- 冒泡排序——Python实现
一.排序思想 排序思想参见:https://www.cnblogs.com/luomeng/p/10161794.html 二.python实现 def bubble_sort(nums): &quo ...
- Effective C++ .05 一些不自动生成copy assigment操作的情况
主要讲了 1. 一般情况下编译器会为类创建默认的构造函数,拷贝构造函数和copy assignment函数 2. 执行默认的拷贝构造/copy assignment函数时,如果成员有自己的拷贝构造/c ...
- 纪念一个神坑——react-native-echarts
一.问题 在rn项目里引用的时候,本该显示图表的界面显示出了一堆html... 二.原因 官方没给配置好 三.解决 1./node_modules/native-echarts/src/compone ...
- Eclipse常用操作
一 Eclipse常用快捷键 ctrl+Q:跳到最后一次编辑处. ctrl+F:在当前文件中查找并替换. ctrl+T:查看类的继承关系. alt+左箭头:返回到光标的上一个位置. alt+右箭头:前 ...
- js-滚动到指定位置导航栏固定顶部
最近整理一下之前做的一个项目,把滚动条动态固定顶部的代码整理出来和大家分享,上代码 <!DOCTYPE html> <html> <head> <meta c ...