看病要排隊
看病要排隊這個是地球人都知道的常識。
不過經過細心的0068的觀察,他發現了醫院里排隊還是有講究的。0068所去的醫院有三個醫生(汗,這么少)同時看病。而看病的人病情有輕重,所以不能根據簡單的先來先服務的原則。所以醫院對每種病情規定了10種不同的優先級。級別為10的優先權最高,級別為1的優先權最低。醫生在看病時,則會在他的隊伍里面選擇一個優先權最高的人進行診治。如果遇到兩個優先權一樣的病人的話,則選擇最早來排隊的病人。
現在就請你幫助醫院模擬這個看病程序。
輸入資料包含多組測驗,請處理到檔案結束。
每組資料第一行有一個正整數N(0<N<2000)表示發生事件的數目。
接下來有N行分別表示發生的事件。
一共有兩種事件:
1:"IN A B",表示有一個擁有優先級B的病人要求醫生A診治。(0<A<=3,0<B<=10)
2:"OUT A",表示醫生A進行了一次診治,診治完畢后,病人出院。(0<A<=3)
對于每個"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
下面是我的代碼 雖然沒有用優先佇列 但我還是想弄明白錯在哪 哭
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct cjj
{
int a;//選擇那位醫生
int b;//優先級
int c;//編號
int d=0;//是否被診治
}brr[3000];
bool cmp(cjj m,cjj n)
{
if(m.a==n.a) return m.b>n.b;
else return m.a<n.a;
}
int main(void)
{
int N;
char cmp1[5]="IN",cmp2[5]="OUT";
while(~scanf("%d",&N))
{
for(int i=0;i<2010;i++)
{brr[i].c=0;brr[i].d=0;} //清零
int j=0;
int cnt1[3]={0},cnt2[3]={0}; //cnt1記錄醫生手頭的病人數,cnt2記錄病人總數
for(int i=0;i<N;i++)
{
char arr[5]={'\0'};
scanf("%s",arr);
if(strcmp(arr,cmp1)==0)
{
scanf("%d%d",&brr[j].a,&brr[j].b);
brr[j].c=j+1;
cnt1[brr[j].a-1]++;cnt2[brr[j].a-1]++;j++;
}
if(strcmp(arr,cmp2)==0)
{
sort(brr,brr+j,cmp);
int k;
int u;
scanf("%d",&k);
if(cnt1[k-1]==0) printf("EMPTY\n");
else
{
if(k==3) u=cnt2[0]+cnt2[1];
if(k==2) u=cnt2[0];
if(k==1) u=0; //優化回圈起點
}
for(;u<j;u++)
{
if(brr[u].a==k&&brr[u].d==0) {printf("%d\n",brr[u].c);brr[u].d=1;cnt1[brr[u].a-1]--;break;}
}
}
}
}
return 0;
}
uj5u.com熱心網友回復:
謝謝大噶了啊轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122283.html
標籤:新手樂園
上一篇:小白求教這個題閱讀以下程式,分析它的運行結果。然后,將其在編譯器中輸入該程式,并運行,檢查其結果是否一致 并分析原因
