题意:给定 n 个按顺序的命令,但是可能有的命令不全,让你补全所有的命令,并且要求让总数最少。
析:没什么好说的,直接用优先队列模拟就行,insert,直接放入就行了,removeMin,就得判断一下队列是不是空的,然后再考虑getMin,这个是不是对应的值,如果队列中首元素比它大,那么就加上一个,
如果相等直接取出,如果小于就不断取队列中最小元素。
代码如下:
#include <bits/stdc++.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(true){ 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)); } } printf("%d\n", ans.size()); for(int i = 0; i < ans.size(); ++i) cout << ans[i] << endl; } return 0; }