信息学奥赛一本通 1357:车厢调度(train)
【题目链接】
ybt 1357:车厢调度(train)
【题目考点】
1. 栈
【解题思路】
该题中,C铁轨就是一个栈。
车厢从A到B,也可以等价为车厢先到C,再到B。
因此该题可以抽象为:数字1到n入栈,出栈顺序能否为指定顺序。
解法1:按照提示做
按照题目“提示”中给出的解法来做,提示如下:
解析:观察发现,整个调度过程其实是在模拟入栈出栈的过程,而这个过程中,我们可以分成三种状态:栈前、栈中、栈后。我们可以发现,当某个数字出栈了,说明比它小的数字要么已经出栈了,要么还在栈里,不能是入栈前状态,并且在栈中的顺序是从大到小的(从栈顶往栈底看),比如出5,那么1,2,3,4要么已经在5之前出了,要么还在栈中(假如1,3,4在栈中,从栈顶往栈底看依次为4,3,1),不能是入栈前的状态。如果某个数字要出栈,那么当前在栈中的数字都必须小于它,否则就与栈的性质矛盾,不合法,于是我们可以这样解决:
从第一个数字开始扫描,a[i]表示当前出栈的数字,如果有比a[i]大的数字还在栈中,那么就产生矛盾,输出“NO”;否则,标记当前数字a[i]为栈后状态,那么[1, a[i]-1]这些数字如果还没出栈,标记为栈中状态。具体我们可以用0表示为确定状态,1表示栈中状态,2表示栈后状态。
该方法复杂度为O(n2)O(n^2)O(n2)。
解法2:模拟
遍历数组a,当前关注的元素a[i]
为此时需要出栈的数值。
- 如果此时栈顶的值与
a[i]
相同,那么出栈,同时i加1,看数组a下一个元素。 - 如果此时栈顶的值与
a[i]
不相同,那么入栈一个数值。b为当前要入栈的数值,入栈后b增加1。
当b为n+1时,i是否遍历到n+1,如果是,则能通过入栈出栈的方式得到序列a,否则无法得到。
该方法复杂度为O(n)O(n)O(n)。
【题解代码】
解法1:按照提示做(复杂度O(n2)O(n^2)O(n2))
#include<bits/stdc++.h>
using namespace std;
#define N 1005
int main()
{int n, a[N], st[N] = {};//st[i]:0表示未确定状态,1表示栈中状态,2表示栈后状态。cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= n; ++i){for(int j = a[i]+1; j <= n; ++j){if(st[j] == 1)//如果比a[i]大的数字j在栈中 {cout << "NO";return 0;}}for(int j = 1; j < a[i]; ++j)//比a[i]小的未出栈的都是栈中状态 {if(st[j] == 0)st[j] = 1;}st[a[i]] = 2;//i已出栈 }cout << "YES";return 0;
}
解法2:模拟 (复杂度O(n)O(n)O(n))
#include<bits/stdc++.h>
using namespace std;
#define N 1005
int main()
{int n, a[N];stack<int> stk;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];int i = 1, b = 1;//b为当前要入栈的数值 while(i <= n && b <= n+1){if(stk.empty() == false && a[i] == stk.top()){ i++;stk.pop();}elsestk.push(b++);}if(i > n)//遍历完了整个a数组 cout << "YES";elsecout << "NO";return 0;
}
信息学奥赛一本通 1357:车厢调度(train)相关推荐
- 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法 更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...
- 信息学奥赛一本通 (C++)上机练习
信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...
- 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”
董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...
- 信息学奥赛一本通 提高篇 第5章 矩阵乘法
例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...
- 《信息学奥赛一本通提高篇》第6章 组合数学
例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...
- 《信息学奥赛一本通 提高篇》
提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...
- 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分
信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC
http://ybt.ssoier.cn:8088/show_source.php?runid=14630195 /* 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC http:/ ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂
信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...
最新文章
- js的Prototype属性 解释及常用方法
- VMware10 —— 安装CentOS7(图解)
- Microsoft.Office.Interop.Excel的用法
- Word Embedding News|词嵌入新鲜事:六月刊:GPT-3来了
- 2014-2015-1学期使用的教材
- python网课答案查询_中国大学慕课Python编程基础期末考试查题公众号答案
- (05)FPGA内部资源
- pythonpandas设置索引_pandas DataFrame的修改方法(值、列、索引)
- 在 Mac 上拷贝(复制)、粘贴的方法
- CSS之立方体绘画步骤
- win7用计算机名共享打印机,WIN7共享打印机 可以同时多少台电脑共享一台打印机-win7一键共享打印机,win7一键共享工具软件...
- sift算法搭建(上半部,五,求二阶三阶黑塞矩阵的逆程序对比,c#实现)
- springboot集成Mybatis返回的值为null
- 内存颗粒和闪存颗粒的区别_内存条怎么判断好坏? 内存颗粒的种类及其差别介绍...
- 使用c语言实现后缀表达式计算器
- 为什么主机IP地址通常以192.168开头?
- 由浅入深学习Flash制作赛车游戏教程
- linux 循环一段ip区间,Shell脚本实现判断IP地址是否在一个ip段内代码分享
- Java对Excel的读写详解(POI)
- 8.解析Kafka中的 Topic 和 Partition
热门文章
- React初尝试-仿写CNode社区
- java 单体测试_单体测试指南
- Lenovo UEFI引导U盘 System x Install Windows Server 2016 R2
- 微信小程序之登录注册界面的实现
- 自定义chrome新标签页
- $body.on(‘click‘,‘button‘,function() {中.on在这里是什么意思的
- 万邦京东获取商品历史价格信息 API
- 什么是软路由,软路由和普通路由器有何区别
- android 手机存储大小设置,如何让手机内存变大?内存不足解决方法【详解】
- 计算机类高级工程师职称评审