題目大意
這是一道優先隊列的題,題目給定 n 個按順序的命令,但是可能有的命令不全,讓你補全所有的命令,并且要求讓總數最少。
思路
用優先隊列模擬,
如果輸入的是insert那就直接加入隊列;
如果輸入的是removeMin就要判斷一下隊列此時是否為空,如果為空就先insert 1.再removeMin;
如果輸入的是getMin就要判斷輸入的數字x是否等于隊列首元素q.top(),這個過程用一個循環來完成,如果隊列中首元素比它大,那么就加上一個,
如果相等直接取出,如果小于就不斷取隊列中最小元素。
#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;
}