首先考虑New操作在没有delect的情况下得到的ID是依次加一的,用cnt来表示最新ID,有了delect操作后,ID会存在一个缺口,该缺口用优先队列的最小堆来完成,每次New弹出队顶元素,如果队列为空,则输出++cnt,否则弹出队顶并且输出。
#include <bits/stdc++.h> using namespace std; priority_queue <int,vector<int>,greater<int> > q; int book[100100]; int main() { int n; scanf("%d",&n); int cnt=0; while(n--) { string s; cin>>s; if(s=="New") { if(q.empty()) { printf("%d\n",++cnt); book[cnt]=1; } else { int t=q.top(); q.pop(); printf("%d\n",t); book[t]=1; } } else { int num; scanf("%d",&num); if(book[num]==1) { book[num]=0; q.push(num); printf("Successful\n"); } else { printf("Failed\n"); } } } }