uva540 Team Queue by sixleaves
2015-06-04 23:45
519 查看
这道题目、主要是对队列的灵活应用。其实就是一道模拟题目,只要你洞察出题目的本质就十分简单。题目意思大体是有多组测试数据,每组的一开始是一个数字t,代表一共有多少的团队,接着是t行输入,每一行都由一个数字n开头,表示队伍的人数。在这之后,输入诺干行的操作指令,E x代表入编号为x的入队列,这里的队列是一个新的而且只有一个的新队列。D代表就是出队列、同时输出该元素、S表示停止模拟。
题目的具体要求是,每次入队里前,先从队列头扫描到队列尾,如果队列里有队友,就排在队友们的最后面(不是该队友的后面,是整队队友的最后面)。如果没有队友则,直接排在队列的最后面。出队列的没什么特别的了。
Keys:其实我们可以通过简单的模拟、发现。由第一个队员到最后一个队员入队列,或者中间有其他出队列。该队列始终可以看成是两个队列的队列。又因为题目要求常数的时间、
所以我们不可能把时间浪费在某个队员属于哪一个队里,所以可以用映射、也就是map来解决这个问题。map<int, int>这个结构刚好能映射这种关系。接下去就是要有一个q2[maxn]来表示所有初始化的队列。一个q来表示新队列,这个q其实就是队列的队列。
1 #include <queue>
2 #include <string>
3 #include <map>
4 #include <iostream>
5 using namespace std;
6
7 const int maxn = 1024;
8
9
int main() {
int t, n, k = 0;
while (cin >> t, t) {
// 列队编号
cout << "Scenario #" << ++k << endl;
int qid = 1;
map<int, int> team;
while (t--) {
cin >> n;
for (int i = 0; i < n; i++) {
int uid;
cin >> uid;
team[uid] = qid;
}
qid++;
}
// uid是队员编号、 tid是那一对队的编号
queue<int> q,q2[maxn];
string op;
int uid;
while (cin >> op, op[0] != 'S') {
// 入队列
if ('E' == op[0]) {
cin >> uid;
int tid = team[uid];
if (q2[tid].empty()) q.push(tid);
q2[tid].push(uid);
}
// 出队列
if ('D' == op[0]) {
int tid = q.front();
int x = q2[tid].front();
q2[tid].pop();
cout << x << endl;
if (q2[tid].empty()) q.pop();
}
}
cout << endl;
}
}
题目的具体要求是,每次入队里前,先从队列头扫描到队列尾,如果队列里有队友,就排在队友们的最后面(不是该队友的后面,是整队队友的最后面)。如果没有队友则,直接排在队列的最后面。出队列的没什么特别的了。
Keys:其实我们可以通过简单的模拟、发现。由第一个队员到最后一个队员入队列,或者中间有其他出队列。该队列始终可以看成是两个队列的队列。又因为题目要求常数的时间、
所以我们不可能把时间浪费在某个队员属于哪一个队里,所以可以用映射、也就是map来解决这个问题。map<int, int>这个结构刚好能映射这种关系。接下去就是要有一个q2[maxn]来表示所有初始化的队列。一个q来表示新队列,这个q其实就是队列的队列。
1 #include <queue>
2 #include <string>
3 #include <map>
4 #include <iostream>
5 using namespace std;
6
7 const int maxn = 1024;
8
9
int main() {
int t, n, k = 0;
while (cin >> t, t) {
// 列队编号
cout << "Scenario #" << ++k << endl;
int qid = 1;
map<int, int> team;
while (t--) {
cin >> n;
for (int i = 0; i < n; i++) {
int uid;
cin >> uid;
team[uid] = qid;
}
qid++;
}
// uid是队员编号、 tid是那一对队的编号
queue<int> q,q2[maxn];
string op;
int uid;
while (cin >> op, op[0] != 'S') {
// 入队列
if ('E' == op[0]) {
cin >> uid;
int tid = team[uid];
if (q2[tid].empty()) q.push(tid);
q2[tid].push(uid);
}
// 出队列
if ('D' == op[0]) {
int tid = q.front();
int x = q2[tid].front();
q2[tid].pop();
cout << x << endl;
if (q2[tid].empty()) q.pop();
}
}
cout << endl;
}
}
相关文章推荐
- 【算法】快速排序法:Quicksort
- LeetCode Unique Paths II(dp)
- Duilib技巧:背景图片平铺
- ios CGContext学习,从UIColor 声称img
- UISlider 的基本用法
- CSUOJ 1638 Continued Fraction
- [Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)
- iOS-学习笔记-UI-第三天
- UITableView的性能优化
- Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)
- SPOJ QTREE Query on a tree
- NSValue
- 人机交互设计——“搜狗输入法”分析
- UIImageView 基本用法
- easyui提交表单数据的时候如何防止二次提交
- Ueditor结合七牛云及百度云存储(JAVA版,ueditor-1.4.3)实现图片文件上传
- STL之deque
- UIScrollView
- UITableView固定表头
- STL --> queue单向队列