题目描述:

栈就是像 "只有一端开口的瓶子" 一样的数据结构,大家可以理解为一个头部固定的数组,无论是取出数字还是放入数字,你都只能在数组末尾那一端(称为栈顶)修改。

非常喜欢数据结构的周老师又在给新加入 ACM 俱乐部的小萌新们传授他的人生经验......

这天,周老师得到了一个乱序的全排列,其中 1⋯n 共 n 个数字,每个数字都恰好只出现一次。但是周老师不喜欢无序的东西,所以他总想要把这个数列弄成一个递增的新数列。但是他现在手里恰好只有一些简单的数据结构—— k 个栈。这些栈一开始全都为空,周老师想要只通过 3 种操作,把初始的序列变成有序的新序列:

  1. 取出序列当前的第一个数字,插入到第 p 个栈的顶部:push p
  2. 取出第 p个栈的顶部数字,插入到新序列的末尾位置:pop p
  3. 取出第 p个栈的顶部数字,插入到第 q 个栈的顶部:move p q

周老师非常的睿智,他一下就想到了如果持有的栈的个数大等于数字总个数(也就是k≥n),那么一定可以完成这项排序工作。作为本次数据结构专题讲课的作业题,周老师想考考身为小萌新的你,至少需要多少个这样的栈才能把给定的初始序列变成有序的新序列呢?换句话说,周老师想知道 k 的最小值 min{k} 是多少。

输入格式:

第一行输入一个正整数 T (1≤T≤100),表示数据组数。接下来 T 组数据,每组数据均满足:

  • 第一行输入一个正整数  (1≤n≤105),表示本组数据输入的全排列序列长度。
  • 第二行输入 n 个由空格间隔开的正整数 p1​,p2​,⋯,pn​,描述全排列序列 P 的组成元素。请注意该序列是有顺序的,操作 1 只能从前往后取数字。输入保证 [1,n]中每个正整数在  p1​⋯ pn​ 中恰好只出现一次。

输出格式:

对于每组数据,请输出一个正整数 k,表示至少需要 k 个这样的栈才能把给定的初始序列变成有序的新序列。

实例:

输入:

3
3
3 2 1
2
1 2
3
2 3 1

输出:

1
1
2

解题思路:

无论是多长的数据,最多也就需要两个栈就可以将其变为有序数组。

主要讨论的问题:用一个栈,还是用两个栈?

一个无序数组通过出入栈变成有序数组,栈是先进后出,而且题中数组元素排序后一定是从1~某个值,所以——

我们可以先只用一个栈,并且令一个变量need=1;遍历数组每一个元素入栈,并同时用while(判断栈是否为空和这个元素是否等于need),如果满足,就使这个元素出栈,need++。如果一遍下来栈里还有元素,说明一个栈不能实现,所以就是用两个栈。

参考代码:

#include<iostream>
#include<stack>
using namespace std;
const int N = 1e5 + 1;
int a[N];
int main()
{int t;cin >> t;while (t--){int n;cin >> n;for(int i=0;i<n;i++){cin >> a[i];//录入元素}stack<int>s;int need = 1;for(int i=0;i<n;i++){s.push(a[i]);while (!s.empty() && s.top() == need)//判断{need++;s.pop();}}if (!s.empty())cout << 2 << endl;elsecout << 1 << endl;}return 0;
}

只有一端开口的瓶子(C++)相关推荐

  1. The 14-th BIT Campus Programming Contest(部分题解)

    A. 两只脑斧 time limit per test1.0 s memory limit per test256 MB inputstandard input outputstandard outp ...

  2. 计算机Python二级公共基础部分

    第一章 数据结构与算法 一.算法 1.1算法的概念 1.1.1.算法的概念 算法:是指解决方案准确而完整的描述 通俗的理解为:解决问题的方法和步骤(不仅仅是理论的) 两个要素:确定方法 确定步骤 比如 ...

  3. 堆栈的栈顶和栈底在哪_【c# .net】堆栈(Stack)

    堆栈(Stack) 1.简介 堆栈(Stack)代表了一个后进先出的对象集合. 注意:后进先出指的是后面添加的元素会排在集合的顶部也就是最前面,按照从后往前添加元素的规则 就像一个,一端封闭,一端开口 ...

  4. python入门(七)

    python数据结构 一.数据结构概述 数据组织在一起的结构叫做数据结构. python中的数据结构:列表,元组,字典,队列,栈,树等等. python内置数据结构:列表.元组等. python扩展数 ...

  5. 系统分析师零散知识点

    数据库连接池技术 是指在系统初期或者初次使用时,完成数据库的连接,以后不再释放此连接,在处理后面的请求时,反复使用这些已经建立的连接. 这种方式可以大大减少数据库的处理时间,有利于提高系统的整体性能. ...

  6. js二维数组_Javascript数组

    数组的概念:引用类型的对象. 本质:内存中存储多个数据的空间,再取个名字. 数据结构:数据结构不同,擅长的操作不同. 数组特点:便于数据的查找与维护. 数组的创建: 方法1:var 数组名=[元素1, ...

  7. C++:STL之vector,deque对比

    为什么80%的码农都做不了架构师?>>>    之所以专门把STL中的这两个拿出来说一说,是因为vector和deque都是支持随机访问的,其支持的迭代器类型都为随机访问,而不像ma ...

  8. 商人渡河问题(MATLAB版)

    目录 一.问题描述 二.算法思想 三.如何实现 四.流程图 1. 主程序 2. 递归函数 crossRiver 五.源程序代码 1. 主程序 DFS.m 2. 过河函数 crossRiver.m 3. ...

  9. 渡河问题matlab程序,商人渡河问题(MATLAB版)

    写得比较详尽,基本上解释清楚了,慢慢看能够看懂. 目录一.题目要求二.算法思想三.如何编程四.流程图1. 主程序2. 递归函数crossRiver五.源程序代码1. 主程序 DFS.m2. 过河函数 ...

最新文章

  1. 编程一个最简单游戏_一个关于AI编程的游戏
  2. java学习(144):file常用方法1
  3. QT5+ROS程序开发
  4. SpringCloud创建Eureka模块集群
  5. php eval 安全性,php – 使用eval解析表单输入的方程式的最安全的方法
  6. brew 无法安装iterm2_MAC 安装OhMyZsh问题记录
  7. python 自动登录网站_python实现网站用户名密码自动登录功能
  8. Linux Shell Web超级终端工具shellinabox
  9. 服务器虚拟盘怎么设置,服务器虚拟内存设置在什么盘
  10. 【雷达与对抗】【2014.06】荷兰人工育滩工程Sand Motor的X波段雷达深度反演模型研制
  11. 详细领略Java的输入流和输出流
  12. java日期计算_java中date日期计算使用方法
  13. Android开源网站
  14. (3)paddle---近视眼睛分类的例子
  15. 解决Mac笔记本电脑自带录屏软件没有声音问题
  16. 65W氮化镓Switch底座扩展坞方案
  17. 无线路由器怎么连接移动wifi来使用
  18. HCIP第九天笔记(OSPF的路由回馈、路由策略、以及配置指南)
  19. Android 中触摸事件与点击事件分析
  20. iOS CoreAnimation专题——实战篇(四)基于拖动手势的视图3D旋转效果

热门文章

  1. 关于解决显卡自己卸载后,无法安装新显卡驱动的解决办法(亲测)
  2. Excel 中连续生成开始日期和结束日期之间的日期
  3. 牺牲一个存储空间的循环队列实现方法
  4. 在 Jupyter Notebook 中使用R语言
  5. [数据结构与算法]动态规划:扔鸡蛋问题
  6. TIA博途中进行积分运算的具体方法
  7. 瞬时频率函数matlab,Hilbert 变换与瞬时频率
  8. 开关磁阻电机的直接瞬时转矩控制(DITC)
  9. tf-faster-rcnn训练报错: Loaded runtime CuDNN library: 7.0.5 but source was compiled with: 7.1.4.r-rcn
  10. 学生成绩管理系统-C语言(附源码)