本文主要是介绍Uva540:团体队列(详解包看懂),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、题目
- 二、思路分析
- 用例题数据来分析
- 三、步骤
一、题目
有t 个团队的人正在排长队。每有一个新来的人时,他会从队首开始向后搜寻,如果发现有队友正在排队,他就会插队到他队友的身后;如果没有发现任何一个队友排队,他就只好站在长队的队尾。
输入每个团队中所有队员的编号,要求支持如下 3 种指令:
ENQUEUE x:编号为 x 的人进入长队。
DEQUEUE:长队的队首出队。
STOP:停止模拟。
对于每个 DEQUEUE 指令,输出出队的人的编号。
二、思路分析
首先要给每一个人都给编号,以及用map映射让每一个人都有自己的团队编号。出队则踢了第一个人就可以,入队的操作就是先找到长队中的第一个团队,再把人加到这个团队的末尾即可。
用例题数据来分析
- ENQUEUE 101:101编号的人入队,因为前面没有人,所以团队队列队首编号为1。
101 |
- ENQUEUE 201: 201编号的人入队,因为前面有团队1,但是没有团队2的人,所以排在101后面
101 | 201 |
- ENQUEUE 102:插入102,因为前面有个101一队的,所以就插到101后面,201前面
101 | 102 | 201 |
4.ENQUEUE 202:前面有201,所以来到202后面
101 | 102 | 201 | 202 |
下面的以此类推,最后出栈并输出的时候就是先入先出的顺序
三、步骤
1. 用一个map映射给所有人编号。
int t, kcase = 0;//t表示有几个团队,kcase为团队号,自增while (scanf("%d", &t) == 1 && t) {printf("第%d组", &++kcase);//记录所有人的编号map<int, int> team;//team[x]为编号为x所在团队编号for (int i = 0; i < t; i++) {int n, x; //n为每组的人数,x为人的编号scanf("%d", &n);while (n--) {scanf("%d", &x);team[x] = i;}}}
**2.**编号完了以后就可以用队列来做了。
系统只识别指令第一个字母,比如出队操作,则识别’D’,出队比较简单,找到团队队列的首元素团队,再找到该团队的第一个人,然后把这个人踢掉,就ok;
如果是入队’E’,那么就先找到入队人x所在团队的编号t,如果团队t这个队列没有元素,那么就说明前面没有人在排队,于是就代表团队t,加到长队的最后。
//模拟队列操作queue<int> q, qt[maxt];//q为团队队列,qt[i]为团队成员队列while (1) {int x;char cmd[10];scanf("%s", cmd);if (cmd[0] == 'S') break;else if (cmd[0] == 'D') {int t = q.front(); //长队队首出列,得到队首的团队编号tprintf("%d\n", qt[t].front()); //打印团队t的队首qt[t].pop(); //该人出队if (qt[t].empty()) //如果踢了上面那个人以后,团队t为空,那么团队t直接出队q.pop();}else if (cmd[0] == 'E') { //入队scanf("%d", &x); //输入个人编号xint t = team[x]; //获取该个人所在团队的团队编号tif (qt[t].empty()) q.push(t); //如果团队t没有人,则团队t进入队列队尾qt[t].push(x); //团队t队尾加入个人x}}
总代码
#include<map>
#include<queue>
#include<cstdio>using namespace std;const int maxt = 1000 + 10;int main() {int t, kcase = 0;//t表示有几个团队,kcase为团队号,自增while (scanf("%d", &t) == 1 && t) {printf("第%d组", &++kcase);//记录所有人的编号map<int, int> team;//team[x]为编号为x所在团队编号for (int i = 0; i < t; i++) {int n, x; //n为每组的人数,x为人的编号scanf("%d", &n);while (n--) {scanf("%d", &x);team[x] = i;}}//模拟队列操作queue<int> q, qt[maxt];//q为团队队列,qt[i]为团队成员队列while (1) {int x;char cmd[10];scanf("%s", cmd);if (cmd[0] == 'S') break;else if (cmd[0] == 'D') {int t = q.front(); //长队队首出列,得到队首的团队编号tprintf("%d\n", qt[t].front()); //打印团队t的队首qt[t].pop(); //该人出队if (qt[t].empty()) //如果踢了上面那个人以后,团队t为空,那么团队t直接出队q.pop();}else if (cmd[0] == 'E') { //入队scanf("%d", &x); //输入个人编号xint t = team[x]; //获取该个人所在团队的团队编号tif (qt[t].empty()) q.push(t); //如果团队t没有人,则团队t进入队列队尾qt[t].push(x); //团队t队尾加入个人x}}}return 0;
}
这篇关于Uva540:团体队列(详解包看懂)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!