您的位置:首页 > 其它

HDU 1873 看病要排队(优先队列的简单应用)

2014-11-04 16:45 399 查看

看病要排队

题目信息:这道题主要考察的是“优先队列的应用”。

优先队列: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: