『写在前面的一些基础』
1.优先队列的特性
这个优先到底是如何优先? 和普通队列区别在哪?
- 不是先进先出,先出的是优先级最高的,即优先队列是一个拥有权值概念的单向队列(queue).
2.定义 和 赋值
priority_queue<Type, Container, Functional>
- ¨Type为数据类型, Container为保存数据的容器,Functional为元素比较方式
- ¨第一个参数必须写,后两个可不写。
- ¨如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,维护最大值。 ¨即与priority_queue<int,vector<int>,less<int> >效果相同。
- 维护最小值则用¨priority_queue<int,vector<int>,greater<int> >(两个'>'之间要加空格 防止编译器误认为'>>')
priority_queue<int, vector<int>,less<int> > q;
priority_queue<int, vector<int>,less<int> > a=q;
priority_queue<int, vector<int>,less<int> > b={1,2};
3.一些基础操作
- q.push(x);//将元素x插入队尾
- q.top();//返回队首数据
- q.pop();//队列头部数据(最值)出队
- q.empty();//判断优先队列q是否为空
- q.size();//返回队列的元素个数
优先队列中没有迭代器 ,也没有clear()操作
『上题上题』
【懒羊羊吃草】
懒羊羊也有存储粮食的习惯。每当他存储一份粮食时,他会专门拿出一个筐来存放。因此,他的仓库里有很多很多筐的青草。而我们的懒羊羊又是一个经常馋嘴的小羊,每当他想吃草时,就会从仓库里找出数量最少的一筐草,把它吃掉。可是懒羊羊因为草吃得太多了导致大脑运转缓慢,所以他不得不向你请求支援,帮他找出他应该吃数量为多少的青草。
【输入要求】
第一行为一个正整数n,表示懒羊羊一共进行了n次操作(2<=n<=1000000)
第二行至第n+1行每行表示一个懒羊羊的操作,当这行形式为 单独一个字符'q' 时,表示懒羊羊肚子饿了,要吃掉仓库里当前数量最少的那份青草;当这行形式为一个字符'i' 和一个整数k时,表示懒羊羊将一份数量为k的青草存入了仓库,'i'和k之间用空格隔开。
输入数据保证每次询问时仓库里都有草可吃且所有操作中懒羊羊至少会吃一次草。
【输出要求】
每当输入为'q' 时, 输出懒羊羊当前吃掉的那份青草的数量是多少。
【输入样例】
5
i 5
i 2
q
i 9
q
【输出样例】
2
5
『代码代码』
#include <bits/stdc++.h>
using namespace std;
int main(){
priority_queue<int, vector<int>, greater<int> > g;
vector<int> ans;
int n;
scanf("%d",&n);//n次操作
getchar();
for(int i=0;i<n;i++){
string t;
getline(cin,t);
if(t[0] == 'i')
g.push(t[2] - '0');//将规定数量的草入队
else if(t[0] == 'q'){
ans.push_back(g.top());//将队首的元素存在vector中
g.pop();//队首元素出队
}
}
printf("\nans is :\n");
for(vector<int>::iterator it=ans.begin(); it != ans.end(); it++)
cout<<*it<<endl;
return 0;
}