第三部分 數據結構 -- 第三章 樹1371:看病

1371:看病

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 4289 通過數: 1132
【題目描述】
有個朋友在醫院工作,想請BSNY幫忙做個登記系統。具體是這樣的,最近來醫院看病的人越來越多了,因此很多人要排隊,只有當空閒時放一批病人看病。但醫院的排隊不同其他排隊,因爲多數情況下,需要病情嚴重的人優先看病,所以希望BSNY設計系統時,以病情的嚴重情況作爲優先級,判斷接下來誰可以去看病。

【輸入】
第一行輸入n,表示有n個操作。

對於每個操作,首先輸入push或pop。

push的情況,之後會輸入ai 和 bi,分別表示患者姓名和患者病情優先級。

pop後面沒有輸入,但需要你輸出。

【輸出】
對於pop的操作,輸出此時還在排隊人中,優先級最大的患者姓名和優先級。

表示他可以進去看病了。

如果此時沒人在排隊,那麼輸出”none”,具體可見樣例。

【輸入樣例】
7
pop
push bob 3
push tom 5
push ella 1
pop
push zkw 4
pop
【輸出樣例】
none
tom 5
zkw 4
【提示】
【數據規模和約定】

1≤n≤100000,每個人的優先級都不一樣,0≤優先級≤2000000000。

姓名都是小寫字母組成的,長度小於20。


思路:本題容易超時,使用優先隊列priority_queue<node,vector,less >從大到小來解決,先判斷輸入的是pop 還是push,因爲第一個字符都是p所有判斷第二個字符是o 還是u ,我們判斷如果是pop 就是s[1] ='o’來區分是壓入還是彈出,然後判斷如果隊空就輸出none 不空就輸出姓名和編號,否則就是壓入姓名和編號。

#include <bits/stdc++.h>

using namespace std;

int T;

char s[10];

struct node

{

  char name[21];

  int num;//優先級

} a;

bool operator < (node A,node B)//重載符號“<”

{

  return A.num < B.num;//以優先級爲判斷標準

}

priority_queue<node,vector<node>,less<node> > q; //優先隊列

int main()

{

  cin >> T;

  while(T--)

  {

    scanf("%s",&s);

    if(s[1]=='o') //即pop s[0]='p',s[1]='o', push s[0]='p',s[1]='u'區分是壓入還是彈出

    {

      if(q.empty()) cout<<"none"<<endl;//沒人排隊

      else

      {

        node m = q.top();//有人排隊時

        q.pop();//出隊

        printf("%s %d\n", m.name , m.num);

      }

    }

    else //即push

    {

      scanf("%s%d",&a.name,&a.num);

      q.push(a);//入隊

    }

  }

  return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章