题目描述
给定一个数列,初始为空,请支持下面三种操作:
- 给定一个整数 �x,请将 �x 加入到数列中。
- 输出数列中最小的数。
- 删除数列中最小的数(如果有多个数最小,只删除 11 个)。
输入格式
第一行是一个整数,表示操作的次数 �n。
接下来 �n 行,每行表示一次操作。每行首先有一个整数 ��op 表示操作类型。
- 若 ��=1op=1,则后面有一个整数 �x,表示要将 �x 加入数列。
- 若 ��=2op=2,则表示要求输出数列中的最小数。
- 若 ��=3op=3,则表示删除数列中的最小数。如果有多个数最小,只删除 11 个。
输出格式
对于每个操作 22,输出一行一个整数表示答案。
输入输出样例
输入 #1复制
5 1 2 1 5 2 3 2
输出 #1复制
2 5
说明/提示
【数据规模与约定】
- 对于 30%30% 的数据,保证 �≤15n≤15。
- 对于 70%70% 的数据,保证 �≤104n≤104。
- 对于 100%100% 的数据,保证 1≤�≤1061≤n≤106,1≤�<2311≤x<231,��∈{1,2,3}op∈{1,2,3}。
代码:
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
int main(){
int n,op;
long long x;
cin>>n;
while(n--){
cin>>op;
if(op==1){
cin>>x;
q.push(x);
}
else if(op==2){
int min=q.top();
cout<<min<<endl;
}
else {
q.pop();
}
}
}
有题意得,整个小根堆,然后进行操作。
堆的知识点:
头文件:#include<queue>
定义:priority_queue<int> q(变量名);(大根堆)
priority_queue<int,vector<int>,greater<int> (有个空格)> q(变量名);(小根堆)如下图:
(小根堆)
操作:
q.clear()//清空堆中所有元素
q.top()//取得堆顶元素,并不会弹出
q.pop()//弹出堆顶元素
q.push()//往堆里面插入一个元素
q.empty()//查询堆是否为空,为空则返回1否则返回0
q.size()//查询堆内元素数量