題目連結: https://zerojudge.tw/ShowProblem?problemid=c421
# 內容
雲端列印服務公司提出一個新型服務。
該公司有 n 台 3D 印表機,
其中印表機 P1,P2, ..., Pk 用以優先服務最為重要客戶,
印表機 Pk+1, Pk+2, ..., Pn 列印速度較慢,用以優先服務一般客戶。
每個客戶依該年度所選擇服務等級及所繳交費用可有不同的列印優先權,以 1, ..., 10000 表示之;
10000 代表最高列印優先權,1 代表最低列印優先權。
為了不讓低列印優先權的客戶永無止盡的等待,
印表機 P1,P2, ..., Pk 一旦有空,等待的工作中優先權最高的工作就會被交付列印;
而印表機 Pk+1, Pk+2, ..., Pn一旦有空,等待的工作中優先權最低的工作就會被交付列印。
請寫一個程式列舉交付列印工作的順序。
# 輸入
輸入只有一行,共有不定數量的整數,
整數可為 {-2, -1, 0, 1, 2, ..., 10000}, 兩整數之間以一個空白隔開。
-2 表示印表機 P1,P2, ..., Pk其中一台有空,可以列印最高優先權的工作;
-1 表示印表機 Pk+1, Pk+2, ..., Pn其中一台有空,可以列印最低優先權的工作;1, 2, ..., 10000
代表新增一個優先權為該數字之工作;
0 則代表輸入結束。
若輸入為 -1 或 -2 但無等待列印的工作,則不列印,需等待下一個 -1 或 -2 才再列印新的工作。
# 輸出
請依被列印工作的順序,輸出該工作的優先權代號,之後緊接著一個空白。
尚未交付列印的工作不需輸出。
# 解題思路
# 程式碼
#include <bits/stdc++.h> | |
using namespace std; | |
multiset<int> Wait_Qu; | |
void Work_(int i) | |
{ | |
if(i==-1&&!Wait_Qu.empty()) | |
{ | |
multiset<int>::iterator it=Wait_Qu.begin(); | |
printf("%d ",*it); | |
Wait_Qu.erase(it); | |
} | |
else if(i==-2&&!Wait_Qu.empty()) | |
{ | |
multiset<int>::iterator it=Wait_Qu.end(); | |
it--; | |
printf("%d ",*it); | |
Wait_Qu.erase(it); | |
} | |
else if(i!=-1&&i!=-2&&i) | |
Wait_Qu.insert(i); | |
} | |
int main() | |
{ | |
int x; | |
while(scanf("%d",&x)==1&&x) | |
Work_(x); | |
return 0; | |
} |