【优先队列】【priority_queue】【getline】【istringstream】hdu 1873

本文详细介绍了如何使用C++中的priority_queue实现病人的优先级调度,并解决了两个关键问题:一是重载小于运算符以确保相同优先级下先到者优先;二是通过重新创建对象解决队列无法清空的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题需要注意2点:

1. 重载 "<" 的语义:当优先级相等时,先到的优先级高,不能指望 priority_queue 自动将先到但优先级相等的病人排在前面

2. 由于每组数据处理完之后,队列并没有 pop 空,但 priority_queue 又没有提供清空队列的方法,所以只能每组数据都重新创建对象

/**
 * hdu 1873
 * 【优先队列】【priority_queue】
 * 此题需要注意2点:
 * 1. 重载 "<" 的语义:当优先级相等时,先到的优先级高,不能指望
 *    priority_queue 自动将先到但优先级相等的病人排在前面
 * 2. 由于每组数据处理完之后,队列并没有 pop 空,但 priority_queue 又
 *    没有提供清空队列的方法,所以只能每组数据都重新创建对象
 */
#include <queue>
#include <iostream>
#include <string>
using namespace std;

struct SPatient
{
    int m_iId;
    int m_iPriority;
};

bool operator<(const SPatient &oPl, const SPatient &oPr)
{
    if (oPl.m_iPriority == oPr.m_iPriority)
    {
        return (oPl.m_iId > oPr.m_iId);
    }
    return (oPl.m_iPriority < oPr.m_iPriority);
}


int main()
{
    SPatient        oTmpP;
    int             iCmdNum;
    string          strTmp;
    int             iDoctNum;   // doctor number
    int             iNum;

    while (cin >> iCmdNum)
    {
        priority_queue<SPatient>    arrpqPque[3];

        iNum = 0;
        while (iCmdNum--)
        {
            cin >> strTmp;
            if ('I' == strTmp[0])
            {
                ++iNum;
                cin >> iDoctNum >> oTmpP.m_iPriority;
                oTmpP.m_iId = iNum;
                arrpqPque[iDoctNum-1].push(oTmpP);
            }
            else if ('O' == strTmp[0])
            {
                cin >> iDoctNum;
                if (arrpqPque[iDoctNum-1].empty())
                {
                    cout << "EMPTY" << endl;
                }
                else
                {
                    cout << arrpqPque[iDoctNum-1].top().m_iId << endl;
                    arrpqPque[iDoctNum-1].pop();
                }
            }
        }
    }

    return 0;
}


getline() 和 istringstream 的注意点

/**
 * hdu 1873
 * 用 istringstream 处理输入
 */
#include <queue>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct SPatient
{
    int m_iId;
    int m_iPriority;
};


bool operator<(const SPatient &oPl, const SPatient &oPr)
{
    if (oPl.m_iPriority == oPr.m_iPriority)
    {
        return (oPl.m_iId > oPr.m_iId);
    }
    return (oPl.m_iPriority < oPr.m_iPriority);
}


int main()
{
    SPatient        oTmpP;
    int             iCmds;
    string          strCmd;
    istringstream   issCmd;
    string          strTmp;
    int             iDoctNum;   // doctor number
    int             iPriority;
    int             iNum;

    while (cin >> iCmds)
    {
        cin.get();  // 【1】 吸收换行符,防止 getline 吸入
        priority_queue<SPatient>    arrpqPque[3];
        iNum = 0;
        while (iCmds--)
        {
            getline(cin, strCmd);
            issCmd.clear(); // 【2】 修改标志
            issCmd.str(strCmd);
            if ('I' == strCmd[0])
            {
                ++iNum;
                issCmd >> strTmp >> iDoctNum >> iPriority;
                oTmpP.m_iId = iNum;
                oTmpP.m_iPriority = iPriority;
                arrpqPque[iDoctNum-1].push(oTmpP);
            }
            else if ('O' == strCmd[0])
            {
                issCmd >> strTmp >> iDoctNum;
                if (arrpqPque[iDoctNum-1].empty())
                {
                    cout << "EMPTY" << endl;
                }
                else
                {
                    cout << arrpqPque[iDoctNum-1].top().m_iId << endl;
                    arrpqPque[iDoctNum-1].pop();
                }
            }
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值