算法竞赛常用STL库
栈(Stack)
概念:就像一个盒子一样,进去想出来就得等上面的先出去,也就是“先进后出”。
往往栈的功能有上面四种,下面我们手写一个栈来实现这四种功能来更好的理解一下。
模拟栈的实现:
#include<iostream>
#include<string>using namespace std;const int N = 100010;int stk[N], tt; //tt为栈顶指针,初始化为0 int main(){int n; //要进行几次操作 cin >> n;string op; //要进行的操作while (n --){cin >> op;if (op == "push"){int x; //需要入栈的数 cin >> x;stk[++ tt] = x; }else if (op == "pop") tt --;else if (op == "empty") cout << (tt ? "NO" : "YES") << endl;else cout << stk[tt] << endl;} return 0;
}
模拟栈的实现,只需要控制栈顶指针tt即可。
如果想访问栈顶元素时,只需访问tt所指位置的元素即可。
想往栈添加元素,只需让tt加1,指向下一个位置,然后在该位置存数即可。
想删除栈顶元素,只需让tt减1,这个元素也就不在是栈顶元素,也就是被移出了栈。
判断栈是否为空,只需看tt是否为0即可。
当然比赛中我们直接调用STL库即可。
#include<stack> //头文件stack<int> s; //定义一个栈s.size(); //栈中元素的数量 s.empty(); //栈是否为空 s.push(); //将此元素压入栈 s.pop(); //弹出栈顶元素s.top(); //访问栈顶元素
队列
概念:就像排队一样,先来的人排在前面,后来的人只能排在队尾,先来的人可以先走,后来的人只能后走,也就是“先进先出”。
往往队列的功能有上面四种,下面我们手写一个队列来实现这四种功能来更好的理解一下。
#include<iostream>
#include<string>using namespace std;const int N = 100010;int q[N];
int hh, tt = -1; //hh为队头,tt为队尾 int main(){int n; //要进行的操作数 cin >> n;while (n --){string op;cin >> op; //要进行的操作if (op == "push"){int x; //要加入的数 cin >> x;q[++ tt] = x; }else if (op == "pop") hh ++;else if (op == "empty") cout << (hh <= tt ? "NO" : "YES") << endl;else cout << q[hh] << endl; }return 0;
}
模拟队列的实现,只需要控制队头hh和队尾tt即可。
如果想查询队头元素,只需查看hh所指地方值即可。
如果想添加一个元素,只需让tt加1,指向下一个位置,在该位置存数即可。
想删除元素,只需让hh加1,让他指向下一个元素,该元素也就删除了。
判断队列是否为空,只需看队头是否大于队尾即可。如果大于队尾则空,反之则不空。
接下来我们看STL库中的队列方法。
#include<queue>queue<int> q; //定义一个队列que.size(); //返回队列元素数量que.empty(); //返回队列是否为空que.push(); //加入队列que.pop(); //出队que.front(); //返回队首que.back(); //返回队尾
下面我们来看一道天梯赛L2难度的真题:
例题
一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品,放到流水线上。图 2 显示了顺序按下按钮 3、2、3、0、1、2、0 后包装机的状态。
一种特殊情况是,因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落。此外,如果轨道已经空了,再按对应的按钮不会发生任何事;同样的,如果筐是空的,按 0 号按钮也不会发生任何事。
现给定一系列按钮操作,请你依次列出流水线上的物品。
分析
通过对题目的分析,我们发现只需要将轨道看成队列,框看成队列,然后模拟这个过程就可以。
代码
#include<iostream>
#include<queue>
#include<stack>using namespace std;const int N = 110;queue<char> q[N]; //轨道
stack<char> s; //筐
int n, m, smax;int main(){cin >> n >> m >> smax;for (int i = 1; i <= n; i ++) for (int j = 0; j < m; j ++){char c;cin >> c;q[i].push(c);}int x;while (cin >> x, x != -1){if (x == 0 && !s.empty()){ //注意需要判断一下是否为空,如果在为空状态下访问栈顶元素会报错cout << s.top();s.pop();}if (x > 0 && s.size() < smax && q[x].size()){s.push(q[x].front());q[x].pop();}else if (x > 0 && s.size() >= smax && q[x].size()){cout << s.top();s.pop();s.push(q[x].front());q[x].pop();}}return 0;
}
vector
概念:就像一个长度可变的数组一样,把他当成数组处理就可以。
STL库:
#include<vector>vector<int> v; //定义一个vectorv.push_back(item); //向v后加一个元素v.pop_back(); //删除v最后一个元素v.size(); //获取v中元素个数v.empty(); //判断v是否为空v.clear(); //清空v中的元素v[index]; //获取v中下标为index的元素O(1)v.begin(); //返回指向第一个元素的迭代器v.end(); //返回指向vector末尾(最后一个元素之后的那个位置)的迭代器v.front(); //返回第一个元素v.back(); //返回最后一个元素
set
概念:相当于是数学的集合,会对相同的元素进行去重处理并默认排序。
STL库:
#include<set>set<int>s; //定义一个sets.insert(); //插入一个元素 s.size(); //获取元素的个数s.empty(); //判断是否为空s.clear(); //清空ss.count(item); //返回s中item的数量,因为集合中的元素不能重复,因此只能返回0或1
map
概念:map是一个键值对,是一个映射关系,你可以理解为帮你封装好了的hash表,通过键访问你的值。
STL库:
#include<map>map<int,int> mp; //定义一个mapmp.size(); //获取元素个数mp.empty(); //判断是否为空mp.clear(); //清空mpmp[key]=tmp; //可以把键值对key—value中的value赋值为tmp,如果没有对应的键值对,则将该键值对插入到map中
算法竞赛常用STL库相关推荐
- FM算法以及常用python库
FM算法以及常用python库 Factorization Machines: 适用于高维稀疏数据集进行特征组合,发现特征隐藏信息.在CTR,推荐系统中用的很多,这些情况下我也没有用过. 通过目标函数 ...
- 算法竞赛常用OJ食用指南
前言 在准备像ICPC.CCPC.蓝桥杯之类的算法竞赛时,学习完相应的知识点后往往需要大量刷题来巩固,一个OJ的好坏程度我认为可以根据以下几个方面来评定: 1.题目的质量 2.题解的质量 3.比赛的质 ...
- C++常用STL库详细总结
C++STL库函数总结 #include< algorithm >库函数 1.sort排序 2.reverse倒转 3.unique去重 4.二分查找 5.find函数查找 6.字符串和整 ...
- ACM竞赛常用STL(二)之STL--algorithm
<algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的. 下面列举出<algorithm>中的模板函数: adjacent_find / binar ...
- 算法竞赛:Online Judge介绍
专栏:算法竞赛 上一篇: 下一篇: 文章目录 一.什么是Online Judge 二.Online Judge 网站 1. 洛谷 2. LeetCode 力扣 3. 牛客 4. PTA 拼题A 三.算 ...
- 直播 | SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)
「PW Live」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交 ...
- java算法竞赛:快速读入输出
我们在使用java写算法题时,常常会因为超时而苦恼,明明是和C++一样的思路,甚至代码实现都极为相似,但是却比它慢上一大截,这时候不妨试试IO流读入输出数据,提升速度. 参考文章 Java写算法题中那 ...
- 蓝桥杯算法竞赛系列第0章——蓝桥必考点及标准模板库STL(上)(万字博文,建议抱走)
欢迎来到:遇见蓝桥遇见你,不负代码不负卿! 目录 一.蓝桥必考点剖析 二.什么是STL 三.vector的常见用法详解 1.vector的定义 2.vector容器内元素的访问 (1).通过下标访 ...
- C++ STL常用标准库容器入门(vector,map,set,string,list...)
STL常用标准库容器 C++ STL中最基本以及最常用的类或容器无非就是以下几个: 目录 string vector deque list forward_list queue priority_qu ...
最新文章
- Linux下mysql ERROR 1045,Mysql无法执行批处理
- 关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”...
- 【MATLAB教程案例2】GPS信号捕获算法的案例分析
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
- robocopy帮助
- ugui unity 取消选择_UGUI中几种不规则按钮的实现方式
- 判断对象属性值是否为空
- NBU调用crontab备份
- 下面属于javascript内部对象的有_JavaScript从零开始——面向对象编程(2)
- Flutter基础—常用控件之容器
- matlab虚拟现实之建立simulink虚拟现实工具箱的使用
- JAVA编程思想——读书笔记 类再生
- javasript深度拷贝
- 分表用到的一些函数/php mysql 前面补0
- paip.提升安全性--------用户密码控件方案总结
- Oracle数据库出现“本地计算机上的OracleOraDB11g_homeTNSListener服务启动后停止.....”问题解决方案...
- 开发移动网页应用的一些技术指导
- 吉米多维奇数学分析每日一题--习题1382
- 华为数通笔记-DHCPv6原理与实验
- 9个优秀的标签云免费生成工具
热门文章
- [医疗信息化][DICOM教程]HL7 V3 Standard-概述-HL7 V3 Standard - A High Level Overview
- 计算机中心英语怎么说,计算机中心,computer center,音标,读音,翻译,英文例句,英语词典...
- 客户端性能优化实战经验分享
- vue2+element使用插件导出全部表格数据
- 从FrameDebugger看Unity渲染
- java输出中写html标签,java 输出html标签
- Groovy语言 Grails框架入门
- android开发中对图片的处理方式汇总
- 用html做相册需要什么,如何快速有效的生成HTML相册?
- 不要盲目满足用户需求,造成过度设计