HDU 1873 -- 看病要排队 (优先队列)
2015-01-10 00:44
169 查看
题目大意:一个医院有三个医生,不同病人指定医生来看病,根据病情轻重,设有优先级,优先级越高优先权越高,医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治。如果遇到两个优先权一样的病人的话,则选择最早来排队的病人。
一共有两种事件:
1:"IN A B",表示有一个拥有优先级B的病人要求医生A诊治。(0<A<=3,0<B<=10)
2:"OUT A",表示医生A进行了一次诊治,诊治完毕后,病人出院。(0<A<=3)
对于每个"OUT A"事件,在一行里面输出被诊治人的编号ID。如果该事件时无病人需要诊治,则输出"EMPTY"。 诊治人的编号ID的定义为:在一组测试中,"IN A B"事件发生第K次时,进来的病人ID即为K。从1开始编号。
一个标准的大顶堆优先队列模板题。
实现代码:
一共有两种事件:
1:"IN A B",表示有一个拥有优先级B的病人要求医生A诊治。(0<A<=3,0<B<=10)
2:"OUT A",表示医生A进行了一次诊治,诊治完毕后,病人出院。(0<A<=3)
对于每个"OUT A"事件,在一行里面输出被诊治人的编号ID。如果该事件时无病人需要诊治,则输出"EMPTY"。 诊治人的编号ID的定义为:在一组测试中,"IN A B"事件发生第K次时,进来的病人ID即为K。从1开始编号。
一个标准的大顶堆优先队列模板题。
实现代码:
#include<cstdio> #include<queue> using namespace std; struct Node{ int p,num; Node(int a=0,int b=0):p(a),num(b){} }; bool operator<(Node a,Node b){ if(a.p==b.p) return a.num>b.num; return a.p<b.p; } int main(){ int n; char s[10]; struct Node Q; while(~scanf("%d",&n)){ priority_queue<Node>q[3]; int cnt=0; for(int i=0;i<n;i++){ scanf("%s",s); if(s[0]=='I'){ int x,y; scanf("%d%d",&x,&y); cnt++; Q.p=y; Q.num=cnt; Node Q(y,cnt); q[x-1].push(Q); } else{ int x; scanf("%d",&x); if(!q[x-1].empty()){ Q=q[x-1].top(); q[x-1].pop(); printf("%d\n",Q.num); } else printf("EMPTY\n"); } } } }
相关文章推荐
- HDU 1873 看病要排队(优先队列)
- HDU:1873 看病要排队(优先队列)
- HDU - 1873 看病要排队 (优先队列)
- hdu 1873 看病要排队 (优先队列)
- hdu 1873 看病要排队(优先队列)
- HDU 1873 看病要排队(优先队列)
- hdu - 1873 看病要排队 - 优先队列
- HDU 1873 看病要排队(优先队列)
- HDU 1873 看病要排队 优先队列
- HDU 1873 看病要排队 (优先队列)
- hdu 1873 看病要排队(优先队列)
- HDU - 1873 看病要排队 假的优先队列
- HDU 1873 看病要排队(优先队列)
- hdu 1873 看病要排队(优先队列)
- HDU 1873 看病排队(优先队列)
- hdu 1873 看病要排队(优先队列)
- HDU 1873 - 看病要排队(优先队列)
- HDU 1873 看病要排队 (优先队列)
- hdu 1873 看病要排队 优先队列
- HDU 1873 看病要排队(优先队列)