题目描述:
幼儿园里的小朋友在玩排队游戏,他们会根据老师的要求排队。
老师共进行 n 次操作,操作分为以下三种:
-
1 x
: 将一名身高为 x 的小朋友加入队尾 -
2
: 输出队列最前面的小朋友的身高,保证进行该操作时队列非空 -
3
: 将队列里的小朋友按照身高升序排序
输入格式:
第一行,包含一个正整数 n,表示操作次数。
加下来n行按照以下格式之一输入操作:
1 x
2
3
输出格式:
对应操作进行输出。
样例1输入:
9 1 1 1 3 1 2 3 2 2 1 0 3 2
样例1输出:
1 2 0
约定与解释:
对于100%的数据,1≤n≤2×105;0≤x≤109。
样例1解释:
第1个操作后,队列为 [1];
第2个操作后,队列为 [1,3];
第3个操作后,队列为 [1,3,2];
第4个操作后,队列为 [1,2,3];
第5个操作后,队列为 [2,3];
第6个操作后,队列为 [3];
第7个操作后,队列为 [3,0];
第8个操作后,队列为 [0,3];
第9个操作后,队列为 [3]。
本题为数据结构操作题,核心思路是运用priority_queue和queue(优先队列和队列)进行优化,从而实现对大规模数据的运算
下附AC代码
#include <bits/stdc++.h>
using namespace std;
int n;
queue<int> a;
priority_queue <int,vector<int>,greater<int> > q;
void add(int x){
a.push(x);
}
void print(){
if(!q.empty()){
printf("%d\n",q.top());
q.pop();
}else{
printf("%d\n",a.front());
a.pop();
}
}
void sort(){
while(!a.empty()){
q.push(a.front());
a.pop();
}
}
int main(){
scanf("%d",&n);
while(n--){
int k;
scanf("%d",&k);
if(k == 1){
int x;
scanf("%d",&x);
add(x);
}
if(k == 2){
print();
}
if(k == 3){
sort();
}
}
return 0;
}