赞
踩
我发现之前一版在电脑上看 常用函数部分 没有问题,由于是手打上去的,在手机上看会发生错位问题,现已将电脑原版 常用函数部分 截图改为图片形式,不会再发生错位问题,非常感谢大家的支持
1.queue队列
queue的定义和结构如下:
- template <class T, class Container = deque<T>>
- class queue;
以下是一些queue的常用函数:
- ### 这就像一个队伍
- ———————————————————————
- pop出去 < —— 1 2 3 4 5 6 < —— push进来
- ———————————————————————
2.priority_queue优先序列
priority_queue的定义和结构如下:
- template <class T,Container=vector<T>,
- class Compare=less<typename Container::value_type>>
- class priority_queue;
以下是一些priority_queue的常用函数:
### 介绍几种优先队列修改比较函数的方法
1.第一种
- #include<bits/stdc++.h>
- struct Compare{ //仿函数
- bool operator()(int a,int b){ //()重载
- //自定义比较函数
- return a>b; //小根堆
- }
- };
- int main(){
- std::priority_queue<int,std::vector<int>,Compare> pq;
- return 0;
- }
2. 第二种
- #include<bits/stdc++.h>
- auto compare=[](int a,int b){
- //自定义比较函数,按照逆序排列
- return a>b;
- };
- int main(){
- std::priority_queue<int,std::vector<int>,decltype(compare)>pq(compare);
- return 0;
- }
- priority_queue<int,vector<int>,greaterr<int>> pq;
- //std::greater函数对象定义在<functional>头文件中
3.deque双端队列
deque的定义和结构如下:
- template <class T,class Allocator=allocator<T>>
- class deque;
### “单调队列”将使用双端队列来实现(单纯考察双端队列的并不常见)
以下是一些deque的函数:
4.例题讲解:
题号:lanqiao OJ 1113
1.CLZ银行问题
- #include<bits/stdc++.h>
- using namespace std;
- int main(){
- ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
- int m;
- cin>>m;
- queue<string> V,N;
- while(m--){
- string op;
- cin>>op;
- //判断是否为来到窗口
- //IN情况,推入name
- if(op=="IN") {
- string name,q;
- cin>>name>>q;
- if(q=="V"){
- V.push(name);
- }
- else{
- N.push(name);
- }
- }
- //out情况,弹出name
- else{
- string q;
- cin>>q;
- if(q=="V"){
- V.pop();
- }
- else{
- N.pop();
- }
- }
- }
- //输出VIP窗口name
- while(V.size()){
- cout<<V.front()<<"\n";
- V.pop();
- }
- //输出普通窗口name
- while(N.size()){
- cout<<N.front()<<"\n";
- N.pop();
- }
- return 0;
- }
题号:lanqiao OJ 741
2.合并果子
- #include<bits/stdc++.h>
- using namespace std;
- using ll=long long;
- int main(){
- ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
- int n;
- cin>>n; //这里直接用队列就好了,没必要再存数组里
- priority_queue<ll,vector<ll>,greater<ll>> pq; //类型比较简单,默认是大根堆,要的是小根堆把less直接改成greater
- for(int i=1;i<=n;++i){
- ll x;
- cin>>x;
- pq.push(x);
- }
-
- ll ans=0;
- while(pq.size()>=2){
- //这里pop出来两个最小的数,也就是小根堆顶部的两个数
- ll x=pq.top();
- pq.pop();
- ll y=pq.top();
- pq.pop();
- ans+=x+y; //求和
- pq.push(x+y); //把最小数的和push回去
- }
- cout<<ans<<"\n";
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。