銀行的客戶隊列 【STL 中 Set 和 Pair 的簡單使用】

題解:

如果每次都排序一遍肯定會超時的,可以使用 STL 中自動排序的 Set ,因爲是兩個數,所以加上 pair 就可以。

如果是2,那就尾部選一個,然後刪除掉。

如果是3,就從頭選一個,然後刪除掉。

加上 pair 排序就是先按第一個排,再按第二個,都是從小到大的順序。

注意 set 的begin( ) 和 end( ) 。

一開始的憨憨思路:

最初想的是用兩個優先隊列,一個大的,一個小的,然後開兩個map ,一個記錄優先值,一個記錄是否把該數刪除掉,理論上自己臆想還可以哈哈哈,不過後來發現了這樣很麻煩,寫了會就放棄了,有一些樣例不好處理。

正好複習一下 set 和 pair 使用。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int q,k,p;
    set<pair<int ,int > > st;
    set<pair<int, int> > :: iterator it;
    while(cin >> q && q){
        if(q == 1){
            cin >> k >> p;
            st.insert(make_pair(p,k));
        }
        else if(q == 2){
            if(st.empty()){
                cout << 0 << endl;
            }
            else {
                it = st.end();
                it--;
                cout << it->second << endl;
                st.erase(it);
            }
        }
        else if(q == 3){
            if(st.empty()){
                cout << 0 << endl;
            }
            else {
                it = st.begin();
                cout << it->second << endl;
                st.erase(it);
            }
        }
    }
    return 0;    
}

 

某個銀行很傲嬌,來了一些客戶,有時先接待優先級最高的客戶,有時先接待優先級最低的客戶,有如下四種操作:

0:系統停止服務。

1 K P:增加一個 ID 爲 K(K\leq 10^6)的客戶,其優先級是 P(P\leq 10^7)。

2:查詢優先級最高的客戶,接待他,並從等候隊列裏刪除。

3:查詢優先級最低的客戶,接待他,並從等候隊列裏刪除。

你的任務是依次輸出這些客戶的 ID。

輸入格式

若干行,以 0 結束(總操作數不超過 10^5)。

一個客戶可能訪問多次;保證在任意時刻,隊列中的優先級各不相同。

輸出格式

對於 2 和 3 操作,一行一個整數表示 D,若查詢無結果,則輸出 0。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章