【题目链接】

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)相关推荐

  1. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  2. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  3. 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”

    董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...

  4. 信息学奥赛一本通 提高篇 第5章 矩阵乘法

    例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...

  5. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  6. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  7. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  8. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  9. 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC

    http://ybt.ssoier.cn:8088/show_source.php?runid=14630195 /* 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC http:/ ...

  10. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

最新文章

  1. js的Prototype属性 解释及常用方法
  2. VMware10 —— 安装CentOS7(图解)
  3. Microsoft.Office.Interop.Excel的用法
  4. Word Embedding News|词嵌入新鲜事:六月刊:GPT-3来了
  5. 2014-2015-1学期使用的教材
  6. python网课答案查询_中国大学慕课Python编程基础期末考试查题公众号答案
  7. (05)FPGA内部资源
  8. pythonpandas设置索引_pandas DataFrame的修改方法(值、列、索引)
  9. 在 Mac 上拷贝(复制)、粘贴的方法
  10. CSS之立方体绘画步骤
  11. win7用计算机名共享打印机,WIN7共享打印机 可以同时多少台电脑共享一台打印机-win7一键共享打印机,win7一键共享工具软件...
  12. sift算法搭建(上半部,五,求二阶三阶黑塞矩阵的逆程序对比,c#实现)
  13. springboot集成Mybatis返回的值为null
  14. 内存颗粒和闪存颗粒的区别_内存条怎么判断好坏? 内存颗粒的种类及其差别介绍...
  15. 使用c语言实现后缀表达式计算器
  16. 为什么主机IP地址通常以192.168开头?
  17. 由浅入深学习Flash制作赛车游戏教程
  18. linux 循环一段ip区间,Shell脚本实现判断IP地址是否在一个ip段内代码分享
  19. Java对Excel的读写详解(POI)
  20. 8.解析Kafka中的 Topic 和 Partition

热门文章

  1. React初尝试-仿写CNode社区
  2. java 单体测试_单体测试指南
  3. Lenovo UEFI引导U盘 System x Install Windows Server 2016 R2
  4. 微信小程序之登录注册界面的实现
  5. 自定义chrome新标签页
  6. $body.on(‘click‘,‘button‘,function() {中.on在这里是什么意思的
  7. 万邦京东获取商品历史价格信息 API
  8. 什么是软路由,软路由和普通路由器有何区别
  9. android 手机存储大小设置,如何让手机内存变大?内存不足解决方法【详解】
  10. 计算机类高级工程师职称评审