題目大意
這是一道優(yōu)先隊(duì)列的題沟绪,題目給定 n 個(gè)按順序的命令,但是可能有的命令不全褪秀,讓你補(bǔ)全所有的命令蓄诽,并且要求讓總數(shù)最少。
思路
用優(yōu)先隊(duì)列模擬媒吗,
如果輸入的是insert那就直接加入隊(duì)列仑氛;
如果輸入的是removeMin就要判斷一下隊(duì)列此時(shí)是否為空,如果為空就先insert 1.再removeMin闸英;
如果輸入的是getMin就要判斷輸入的數(shù)字x是否等于隊(duì)列首元素q.top()锯岖,這個(gè)過程用一個(gè)循環(huán)來完成,如果隊(duì)列中首元素比它大自阱,那么就加上一個(gè)嚎莉,
如果相等直接取出,如果小于就不斷取隊(duì)列中最小元素沛豌。
#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
char s[15],t[30];
vector<string> ans;
int main()
{
int n,x;
while(cin>>n)
{
ans.clear();
priority_queue<int, vector<int> , greater<int> > q;
for(int i=0;i<n;i++)
{
scanf("%s",s);
if(s[0]=='i')
{
scanf("%d",&x);
sprintf(t,"insert %d",x);
ans.push_back(string(t));
q.push(x);
}
else if(s[0]=='r')
{
if(q.empty())
{
ans.push_back("insert 1");
q.push(1);
}
ans.push_back("removeMin");
q.pop();
}
else
{
scanf("%d",&x);
while(1)
{
if(q.empty()||q.top()>x)
{
q.push(x);
sprintf(t,"insert %d",x);
ans.push_back(string(t));
}
else if(q.top()==x)
{
break;
}
else
{
ans.push_back("removeMin");
q.pop();
}
}
sprintf(t,"getMin %d",x);
ans.push_back(string(t));
}
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<endl;
}
return 0;
}