1. 程式人生 > >5-7 UVA 12100 Printer Queue列印佇列

5-7 UVA 12100 Printer Queue列印佇列

大致題意:

輸入一定數量的列印任務,並伴隨有優先順序,按優先順序從大到小的順序列印,從隊首(位置為0)開始列印,發現隊後存在一個列印任務的優先順序高於自己,則自己放於隊後,先列印優先順序高的。

整體思路:

不用想,根據題意,存資料(優先順序)用肯定用queue存(當然有很多方法,這是最好想的!),但queue不能根據優先順序進行排序,所以要在找一個"容器"能存的資料自動排序,優先佇列priority_queue最好好(set對於隊首和隊尾的操作不如queue好!),所以在把優先順序存入第一個queue的同時,也把優先順序存到優先佇列中,讓優先佇列裡面的資料,優先順序根據整數大小進行排序,一個一個對比,不一樣的話 ,直接放到隊尾,否則列印,sum++。

有個技巧,用m來記錄標記位置的動態取向,直到輸出標記位置時,跳出迴圈輸出sum!

#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        priority_queue<int,vector<int> >pq;
        queue<int>q;
        int n,m,x,sum = 0;
        scanf("%d%d",&n,&m);
        for (int i = 0; i < n; ++i){
            scanf("%d",&x);
            pq.push(x);
            q.push(x);
        }
        for (;;){
            if (pq.top() == q.front()){
                sum++;
                if (!(m--))break;
                pq.pop();q.pop();
            }
            else {
                if (!(m--))m = q.size() - 1;
                q.push(q.front());
                q.pop();
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}