Problem Description看病要排隊這個是地球人都知道的常識。
不過經過細心的0068的觀察,他發現了醫院裡排隊還是有講究的。0068所去的醫院有三個醫生(汗,這麼少)同時看病。而看病的人病情有輕重,所以不能根據簡單的先來先服務的原則。所以醫院對每種病情規定了10種不同的優先順序。層級為10的優先權最高,層級為1的優先權最低。醫生在看病時,則會在他的隊伍裡面選擇一個優先權最高的人進行診治。如果遇到兩個優先權一樣的病人的話,則選擇最早來排隊的病人。
現在就請你協助醫院類比這個看病過程。
Input輸入資料包含多組測試,請處理到檔案結束。
每組資料第一行有一個正整數N(0<N<2000)表示發生事件的數目。
接下來有N行分別表示發生的事件。
一共有兩種事件:
1:"IN A B",表示有一個擁有優先順序B的病人要求醫生A診治。(0<A<=3,0<B<=10)
2:"OUT A",表示醫生A進行了一次診治,診治完畢後,病人出院。(0<A<=3)
Output對於每個"OUT A"事件,請在一行裡面輸出被診治人的編號ID。如果該事件時無病人需要診治,則輸出"EMPTY"。
診治人的編號ID的定義為:在一組測試中,"IN A B"事件發生第K次時,進來的病人ID即為K。從1開始編號。
Sample Input
7IN 1 1IN 1 2OUT 1OUT 2IN 2 1OUT 2OUT 12IN 1 1OUT 1
Sample Output
2EMPTY311
Authorlinle
Source2008浙大研究生複試熱身賽(2)——全真類比
/********************************* * 日期:2013-3-16 * 作者:SJF0115 * 題號: HDU 題目1873: 看病要排隊 * 來源:http://acm.hdu.edu.cn/showproblem.php?pid=1873 * 結果:AC * 來源:2008浙大研究生複試熱身賽(2)——全真類比 * 總結: **********************************/#include<iostream>#include<stdio.h>#include<queue>using namespace std;struct Patient { //值 int priority;//編號 int key; //重載操作符 friend bool operator < (Patient p1,Patient p2) { if(p1.priority != p2.priority){return p1.priority < p2.priority;}else{return p1.key > p2.key;} }};int main(){int i,N,k;char Type[4];int DoctorID,PatientID;Patient patient[2001];while(scanf("%d",&N) != EOF){//定義三個醫生priority_queue<Patient> Doctor1;priority_queue<Patient> Doctor2;priority_queue<Patient> Doctor3;k = 1;while(N--){scanf("%s",Type);//診治if(strcmp(Type,"IN") == 0){//輸入病人和醫生patient[k].key = k;scanf("%d %d",&DoctorID,&patient[k].priority);//排隊if(DoctorID == 1){Doctor1.push(patient[k]);}else if(DoctorID == 2){Doctor2.push(patient[k]);}else{Doctor3.push(patient[k]);}k++;}//出院else if(strcmp(Type,"OUT") == 0){//醫生DoctorID進行了一次診治,診治完畢後,病人出院scanf("%d",&DoctorID);//醫生1if(DoctorID == 1){if(Doctor1.empty()){printf("EMPTY\n");}else{printf("%d\n",Doctor1.top().key);//出院Doctor1.pop();}}//醫生2else if(DoctorID == 2){if(Doctor2.empty()){printf("EMPTY\n");}else{printf("%d\n",Doctor2.top().key);//出院Doctor2.pop();}}//醫生3else{if(Doctor3.empty()){printf("EMPTY\n");}else{printf("%d\n",Doctor3.top().key);//出院Doctor3.pop();}}}}}return 0;}
注意:此題用的是優先順序隊列
如果不瞭解優先順序隊列,請參考博文:點擊開啟連結