【优先队列】【priority_queue】【getline】【istringstream】hdu 1873
  48HTyjGrRLH9 2023年11月02日 66 0


此题需要注意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;
}



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  0m5NSAqMb1kD   2023年12月08日   31   0   0 MySQLMySQLcici
  5a6ysVJd64PV   2023年12月12日   31   0   0 ciredisciredis
48HTyjGrRLH9