hdu1873 看病要排隊(結構體優先隊列)
看病要排隊
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5769 Accepted Submission(s): 2369
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
7 IN 1 1 IN 1 2 OUT 1 OUT 2 IN 2 1 OUT 2 OUT 1 2 IN 1 1 OUT 1
Sample Output
2 EMPTY 3 1 1
Author linle
Source 2008浙大研究生復試熱身賽(2)——全真模擬
Recommend lcy | We have carefully selected several similar problems for you: 1871 1509 1872 1876 1874
用隊列模擬看病過程就好啦 。
。
。為什麽我的眼裏有了淚水。。
由於我鏈表不會。。。
#include <stdio.h> #include <queue> using namespace std; struct node { int x,num; friend bool operator<(node a,node b)//先對病人的優先級排序,假設相等再對編號排序 { if(a.x<b.x) return true; if(a.x==b.x&&a.num>b.num) return true; return false; } }; priority_queue<node>s1;// priority_queue<node>s2;// priority_queue<node>s3;//哈哈 用了三個。。。 int main() { int n,mark[2005]; char str[10]; while(scanf("%d",&n)!=EOF) { while(!s1.empty()) s1.pop(); while(!s2.empty()) s2.pop(); while(!s3.empty()) s3.pop(); int q=0,a,b,t=1; for(int i=0;i<n;i++) { scanf("%s",str); if(str[0]==‘I‘)//假設IN { node temp; scanf("%d %d",&a,&b); temp.num=t++,temp.x=b; if(a==1) s1.push(temp); else if(a==2) s2.push(temp); else s3.push(temp); } else//假設OUT,用一個mark數組記錄一下序號病人,當然,假設隊列為空。記錄為0 { node temp; scanf("%d",&a); if(a==1) { if(!s1.empty()) { temp=s1.top(),s1.pop(); mark[q++]=temp.num; } else mark[q++]=0; } else if(a==2) { if(!s2.empty()) { temp=s2.top(),s2.pop(); mark[q++]=temp.num; } else mark[q++]=0; } else { if(!s3.empty()) { temp=s3.top(),s3.pop(); mark[q++]=temp.num; } else mark[q++]=0; } } } for(int i=0;i<q;i++)//推斷mark【i】數值輸出 { if(mark[i]==0) printf("EMPTY\n"); else printf("%d\n",mark[i]); } } return 0; }
hdu1873 看病要排隊(結構體優先隊列)