1. 程式人生 > 其它 >UVA540 團體佇列 Team Queue 題解

UVA540 團體佇列 Team Queue 題解

0x00 前言

自己整了個翻譯呢

一開始寫的超級複雜


後開借鑑別人思路才知道其實不長

0x01 讀題

在團隊佇列中,每個元素都屬於一個團隊。

如果元素進入佇列。它首先從頭到尾搜尋隊列,檢查它的一些團隊成員(同一團隊的元素)是否已經在佇列中。如果是,它就插入它們的後面。如果不是,它將在尾部進入佇列併成為新的最後一個元素。

退出佇列的操作與普通佇列類似:元素按照它們在團隊佇列中出現的順序從頭到尾進行處理。

您的任務是編寫一個程式來模擬這樣的團隊佇列。

輸入檔案將包含一個或多個測試樣例。

每個測試樣例從團隊數量 \(t\ (1 <t< 1000)\) 開始。

接下來是對團隊的描述,每個描述包含屬於團隊的元素的數量和元素本身。元素是 \(\left[0,1000000\right)\)

範圍內的整數。一個團隊可能由多達 \(1000\) 個元素組成。

最後,下面是一個命令列表。有三種不同的命令:

  • \(\mathtt{ENQUEUE}\ x\):在團隊佇列中輸入元素 \(x\)

  • \(\mathtt{DEQUEUE}\):處理第一個元素並將其從佇列中移除

  • \(\mathtt{STOP}\):結束測試用例

測試樣例結束時輸入 \(0\)

警告:一個測試樣例可能包含多達 \(200000\) 個命令,因此查詢和退出一個元素應該只花費常量時間。

對於每個測試用例,首先列印一行\(Scenario #k\),其中 \(k\) 是測試樣例的編號。

然後,對於每個 \(\mathtt{DEQUEUE}\)

的命令,在一行中輸出被退出佇列的元素。

在每個測試樣例之後輸出空行,在最後一個測試樣例之後也是如此。

0x02 分析

模擬,它是個模擬

不廢話了

0x03 程式碼

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N=200100;

inline ll read(){
	ll x=0,y=1;
	char c=getchar();
	while (c<'0'||c>'9'){
		if(c=='-')
		  	y=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*y;
}

int main(){
    int t,m=1;
    while(cin>>t&&t){
        map<int,int> v;
        for(int i=1;i<=t;i++){
            int n;
            n=read();
            while(n--){
                int x;
                x=read();
                v[x]=i;
            }
        }
        cout<<"Scenario #"<<m++<<endl;
        queue<int> team[N];
        queue<int> total;
        string op;
        while(cin>>op){
            if(op=="STOP")
				break;
            if(op=="ENQUEUE"){
                int x;
                x=read();
                int t=v[x];
                if(team[t].empty())
					total.push(t);
                team[t].push(x);
            }
            if(op=="DEQUEUE"){
                if(!total.empty()){
                    int t=total.front();
                    cout<<team[t].front()<<endl;		
                    team[t].pop();
                    if(team[t].empty())
						total.pop();
                }
            }
        }
        printf("\n");
    }
    return 0;
}