例题5-6 团体队列 Team Queue UVA - 540
Posted yichuan-sun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了例题5-6 团体队列 Team Queue UVA - 540相关的知识,希望对你有一定的参考价值。
还好吧,刚开始没想明白用什么数据结构来做,后来才想到用一个队列和一个队列数组,一个存当前队伍的排队队列,另一个存每个在排队的队伍内部的人员队列。其他的set什么的,都不是最重要的内容了。
卡了我三个点:
1.忘了控制空队出队,空队排头了,导致了RE一次.在写了判定条件之后RE没了,成了WA—_—
2.这次WA是因为没有及时清除中间变量。是比较隐含的中间变量,表示某个队伍是否已在总队伍中的set,我在某只队伍最后一个成员从总队伍中出队后,没有清楚set中这支队伍的标记。也就是说,这支队伍其实不存在于总队伍了,但程序仍显示存在,就出错了。
3.隐含的空队排头,我把它放在了if判定条件里,所以每次检查到这里,我都只注意条件成立后的执行语句去了,就注意不到这一句,心里还一直认为它是正确的
学到了:
1.set可以直接用erase删除值为xx的元素,不一定非得结合迭代器
下面是代码
#include <bits/stdc++.h>
#define N 1005
using namespace std;
map<int,int> qnum;
set<int> sjud;
typedef queue<int> qi;
qi qq; //标记当前总队列
qi cache[N]; //所有在排队的队伍的队员先后顺序,下标表示队伍号
void enqueue();
void dequeue();
int main() {
int n,m,num,cnt=0;
cin>>n;
while (n!=0) {
cout<<"Scenario #"<<++cnt<<endl;
for (int i=0;i<n;i++) {
cin>>m;
for (int j=0;j<m;j++) {
cin>>num;
qnum[num]=i;
}
}
string opt="";
cin>>opt;
while (opt[0]!=‘S‘) {
if (opt[0]==‘E‘) enqueue();
else if (opt[0]==‘D‘) dequeue();
cin>>opt;
}
cout<<endl;
qnum.clear();
sjud.clear();
for (int i=0;i<n;i++)
while (!cache[i].empty()) cache[i].pop();
while (!qq.empty()) qq.pop();
cin>>n;
}
return 0;
}
void enqueue() {
int nr;
cin>>nr;
if (!sjud.count(qnum[nr])){
qq.push(qnum[nr]);
sjud.insert(qnum[nr]);
}
cache[qnum[nr]].push(nr);
}
void dequeue() {
if (qq.empty()) return;
if (!cache[qq.front()].empty()) {
cout<<cache[qq.front()].front()<<endl;
cache[qq.front()].pop();
}
if (cache[qq.front()].empty()&&!qq.empty()) {
sjud.erase(qq.front());
qq.pop();
}
}
以上是关于例题5-6 团体队列 Team Queue UVA - 540的主要内容,如果未能解决你的问题,请参考以下文章