还好吧,刚开始没想明白用什么数据结构来做,后来才想到用一个队列和一个队列数组,一个存当前队伍的排队队列,另一个存每个在排队的队伍内部的人员队列。其他的set什么的,都不是最重要的内容了。
卡了我三个点:
1.忘了控制空队出队,空队排头了,导致了RE一次.在写了判定条件之后RE没了,成了WA—_—
2.这次WA是因为没有及时清除中间变量。是比较隐含的中间变量,表示某个队伍是否已在总队伍中的set,我在某只队伍最后一个成员从总队伍中出队后,没有清楚set中这支队伍的标记。也就是说,这支队伍其实不存在于总队伍了,但程序仍显示存在,就出错了。
3.隐含的空队排头,我把它放在了if判定条件里,所以每次检查到这里,我都只注意条件成立后的执行语句去了,就注意不到这一句,心里还一直认为它是正确的
学到了:
1.set可以直接用erase删除值为xx的元素,不一定非得结合迭代器
下面是代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61#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(); } }
转载于:https://www.cnblogs.com/yichuan-sun/p/9695455.html
最后
以上就是彩色画笔最近收集整理的关于例题5-6 团体队列 Team Queue UVA - 540的全部内容,更多相关例题5-6内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复