题目链接:
看病要排队
题目描述:
7 IN 1 1 IN 1 2 OUT 1 OUT 2 IN 2 1 OUT 2 OUT 1 2 IN 1 1 OUT 1
2 EMPTY 3 1 1
这道题咋一看有点像是队列的题目,因为题目中描述的过程像是队列的模拟,但是题目的要求是,每次OUT的时候输出的是当前最
需要“看病的病人”,而且如果当前最需要看病的病人不止一个,那么就输出先来的那位病人。有了这样分析,那么很明显这是一道优
先队列的题目。
但是需要注意的是,这不是普通的优先队列,决定优先级的元素不止一个,而是由优先权和ID两个值决定,因此我们要重新定义一
下优先队列的优先级,然后重载<运算符,这样的话优先队列内部元素就可以实现优先级之间的比较了。完整代码实现:
#include<cstdio> #include<queue> #include<cstring> using namespace std; class line { public: int value; int ID; friend bool operator < (const line &a,const line &b) { if(a.value!=b.value) return a.value < b.value; else return a.ID > b.ID; } }; void solve(){ int t; while(scanf("%d",&t)!=EOF){ char act[5]; int x,y,k = 1; line tmp; priority_queue <line> q[4]; while(t--){ scanf("%s",act); if(!strcmp(act,"IN")){ scanf("%d %d",&x,&y); tmp.value = y; tmp.ID = k; q[x].push(tmp); ++k; } else{ scanf("%d",&x); if(q[x].empty()){ printf("EMPTY\n"); } else{ printf("%d\n",q[x].top().ID); q[x].pop(); } } } } } int main(){ solve(); return 0; }