看病要排队
题目信息:这道题主要考察的是“优先队列的应用”。
优先队列:STL 的优先队列也定义在头文件<queue>中,用“ priority_queue<int>pq ”来声明。这个pq是一个“越小的整数,优先级越低的优先队列 ”。由于出队元素并不是最先进队的元素,出队的方法由queue的front()变成了top().
也可以自定义优先级,例如:定义priority_queue<int,vector<int>,cmp>pq. 下面是这个cmp的定义:
struct cmp{
bool operator() (comst int a,const int b) const{
//a的优先级比b小时返回
return a%10 > b%10;
}
}
对于一些常见的优先队列,STL 提供了更为简单的定义方法,例如:“越小的整数优先级越大的优先队列”可以写成“ priority_queue<int,vector<int>,greater<int> >pq ”.注意,最后两个" > "符号不要连在一起写,否则会被很多(但不是所有)编译器误认为是" >> "运算符。
这道题就是优先队列的应用,自定义一个结构体,
struct node
{
int id,num;
friend bool operator < (node a,node b)
{
if(a.num!=b.num)
return a.num<b.num;
else
return a.id>b.id;
}
};
实现优先队列,下面是代码,大家可以参考一下。
题目来源:点击打开链接
源代码:
#include <stdio.h>
#include <queue>
using namespace std;
struct node
{
int id,num;
friend bool operator < (node a,node b)
{
if(a.num!=b.num)
return a.num<b.num;
else
return a.id>b.id;
}
};
int main()
{
int n,a,b,count;
char str[5];
node t;
while(scanf("%d",&n)!=EOF)
{
count=0;
priority_queue <node>q[4];
while(n--)
{
scanf("%s",str);
if(str[0]=='I')
{
scanf("%d %d",&a,&b);
t.id=++count;
t.num=b;
q[a].push(t);
}
else
{
scanf("%d",&a);
if(!q[a].empty())
{
t=q[a].top();
q[a].pop();
printf("%d\n",t.id);
}
else
printf("EMPTY\n");
}
}
}
return 0;
}