hdu1873看病要排队(优先队列的应用)

本文介绍了解决HDU1873看病排队问题的方法,通过使用自定义优先级的优先队列来模拟病人的就诊流程。代码实现中包括了三个优先队列分别对应不同级别的医生,并详细展示了如何进行病人入队和出队操作。

题目传送门:hdu1873看病要排队
这道题可以使用优先队列,然后自定义优先级。其余的注意细节然后就没什么问题了。
AC代码如下:

#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
struct man
{
    int du,num;
    friend bool operator<(const man &a,const man &b)
    {
        if(a.du==b.du)
            return a.num>b.num;
        else
            return a.du<b.du;
    }
};
//设置三个优先队列。
priority_queue<man>D1;
priority_queue<man>D2;
priority_queue<man>D3;
int number,doctor,bing;
string ord;
void init()
{
    while(!D1.empty())
        D1.pop();
    while(!D2.empty())
        D2.pop();
    while(!D3.empty())
        D3.pop();
}
void showtime()
{
    while(!D1.empty())
    {
        cout<<"病情级别:"<<D1.top().du<<"病人编号:"<<D1.top().num<<endl;
        D1.pop();
    }
    while(!D2.empty())
    {
        cout<<"病情级别:"<<D2.top().du<<"病人编号:"<<D2.top().num<<endl;
        D2.pop();
    }
    while(!D3.empty())
    {
        cout<<"病情级别:"<<D3.top().du<<"病人编号:"<<D3.top().num<<endl;
        D3.pop();
    }
}
int main()
{
    while(cin>>number)
    {
        init();
        int cnt=0;
        for(int i=1; i<=number; i++)
        {
            cin>>ord;
            if(ord=="IN")
            {
                cnt++;
                cin>>doctor>>bing;
                man q;
                q.du=bing,q.num=cnt;
                switch(doctor)
                {
                case 1:
                    D1.push(q);
                    break;
                case 2:
                    D2.push(q);
                    break;
                case 3:
                    D3.push(q);
                    break;
                }
            }
            //showtime();
            if(ord=="OUT")
            {
                cin>>doctor;
                switch(doctor)
                {
                case 1:
                    if(!D1.empty())
                    {
                        man Q=D1.top();
                        D1.pop();
                        cout<<Q.num<<endl;
                    }
                    else
                        cout<<"EMPTY"<<endl;
                    break;
                case 2:
                    if(!D2.empty())
                    {
                        man Q=D2.top();
                        D2.pop();
                        cout<<Q.num<<endl;
                    }
                    else
                        cout<<"EMPTY"<<endl;
                    break;
                case 3:
                    if(!D3.empty())
                    {
                        man Q=D3.top();
                        D3.pop();
                        cout<<Q.num<<endl;
                    }
                    else
                        cout<<"EMPTY"<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值