看病要排队
看病要排隊(duì)這個是地球人都知道的常識。
不過經(jīng)過細(xì)心的0068的觀察,他發(fā)現(xiàn)了醫(yī)院里排隊(duì)還是有講究的。0068所去的醫(yī)院有三個醫(yī)生(汗,這么少)同時看病。而看病的人病情有輕重,所以不能根據(jù)簡單的先來先服務(wù)的原則。所以醫(yī)院對每種病情規(guī)定了10種不同的優(yōu)先級。級別為10的優(yōu)先權(quán)最高,級別為1的優(yōu)先權(quán)最低。醫(yī)生在看病時,則會在他的隊(duì)伍里面選擇一個優(yōu)先權(quán)最高的人進(jìn)行診治。如果遇到兩個優(yōu)先權(quán)一樣的病人的話,則選擇最早來排隊(duì)的病人。
現(xiàn)在就請你幫助醫(yī)院模擬這個看病過程。
Input
輸入數(shù)據(jù)包含多組測試,請?zhí)幚淼轿募Y(jié)束。
每組數(shù)據(jù)第一行有一個正整數(shù)N(0<N<2000)表示發(fā)生事件的數(shù)目。
接下來有N行分別表示發(fā)生的事件。
一共有兩種事件:
1:"IN A B",表示有一個擁有優(yōu)先級B的病人要求醫(yī)生A診治。(0<A<=3,0<B<=10)
2:"OUT A",表示醫(yī)生A進(jìn)行了一次診治,診治完畢后,病人出院。(0<A<=3)
Output
對于每個"OUT A"事件,請在一行里面輸出被診治人的編號ID。如果該事件時無病人需要診治,則輸出"EMPTY"。
診治人的編號ID的定義為:在一組測試中,"IN A B"事件發(fā)生第K次時,進(jìn)來的病人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 1Sample Output
2 EMPTY 3 1 1這道題用優(yōu)先隊(duì)列:
Copy #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; struct Node{int number;int priority;bool operator<(Node b)const{if(priority==b.priority)return number>b.number;elsereturn priority<b.priority;} }temp; int n; char c[100]; int main() {while(cin>>n){int count=0;if(getchar()!='\n');priority_queue<Node> q1,q2,q3;while(n--){gets(c);if(c[0]=='I'){switch(c[3]){case '1':count++;temp.number=count;if(c[6]=='0')temp.priority=10;else temp.priority=c[5]-'0';q1.push(temp);break;case '2':count++;temp.number=count;if(c[6]=='0')temp.priority=10;else temp.priority=c[5]-'0';q2.push(temp);break;case '3':count++;temp.number=count;if(c[6]=='0')temp.priority=10;else temp.priority=c[5]-'0';q3.push(temp);break;} }else // OUT{switch(c[4]){case '1':if(!q1.empty()){cout<<q1.top().number<<endl;q1.pop();}elsecout<<"EMPTY"<<endl;break;case '2':if(!q2.empty()){cout<<q2.top().number<<endl;q2.pop();}elsecout<<"EMPTY"<<endl;break;case '3': if(!q3.empty()){cout<<q3.top().number<<endl;q3.pop();}elsecout<<"EMPTY"<<endl;break; }}}}return 0; }?
總結(jié)
- 上一篇: C语言实现牛顿迭代法
- 下一篇: 湫湫系列故事——消灭兔子