解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决
题目大意:
有t个团队的人正在排一个长队,每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友的身后。如果没有任何一个队友排队,那么他会排到长队的队尾。输入每个团队中所有队员的编号,要求支持如下三种指令(前两种指令可穿插进行):
*ENQUEUE x:编号为x的人进入长队
*DEQUEUE:长队的队首出队
*STOR:停止模拟
对于每个DEQUEUE指令,输出出队的人的编号。
样例输入:
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5 259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005 260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE 259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE 260002
ENQUEUE 260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
样例输出:
Scenario #1
101
102
103
201
202
203Scenario #2
259001
259002
259003
259004
259005
260001
本题的难点:
难点1:如何判断新进队的队员是哪个团队的,
难点2:判断出ta是哪个团队的后,判断该团队最后一个人在哪。
解决办法:
1、利用map的映射关系建立一个索引。 key值是每个团队的编号,value是该团队下队员的编号,key对value是一对多的关系。
2、建立队列q,二维队列q2(相当于很多行队列),q存储团队编号, q2[i]存储编号为i的团队下队员的编号。
这样一来,如果是入队:对新进队员判断时, 若新队员编号为i,则map[i]就是团队的编号, 只需将新队员入队q2[map[i]]中即可(该团队最后一个位置)。
如果是出队:则q.top()为队列头部团队, q2[q.top()].pop()表示将最靠前团队中最前面的队员出队。
核心思想:
利用map的映射特性做二维队列的索引
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxt = 1000 + 10; //防止溢出
int main() {int t, kase = 0;while(cin >> t && t) { //t个团队 cout << "Scenario #" << ++kase << endl;map<int, int> team; //key是团队编号,value是个人编号 for(int i = 0; i < t; i++) {//输入每个团队队员编号 int n, x; cin >> n;while(n--) { cin >> x; team[x] = i; } //建立索引 }queue<int> q, q2[maxt]; //q是团队队列,q2[i]是团队i成员的队列for(;;) {int x;char cmd[10]; cin >> cmd;if(cmd[0] == 'S') break;else if(cmd[0] == 'D') {int t = q.front();cout << q2[t].front() << endl; q2[t].pop(); if(q2[t].empty()) q.pop(); //团体t全体出队列 } else if(cmd[0] == 'E') {cin >> x;int t = team[x];if(q2[t].empty()) q.push(t); //团队t进入队列q2[t].push(x); } } cout << endl; }return 0;
}
结语:
没有良好的代码设计,是无法发挥STL的威力的,如果没有想到“map做索引”这个思路,就很难用map简化代码。
map的另一个用法可以参考我的这篇博文(map做桥梁连接三种STL容器)→例题5-5 集合栈计算机 UVa12096
如果对你有帮助的话,留个赞再走叭 Thanks♪(・ω・)ノ
日拱一卒,功不唐捐
解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决相关推荐
- uva 540 (Team Queue UVA - 540)
又是一道比较复杂的模拟题.题中有两种队列,一种是总队列,从前向后.其他的是各个团体的小队列,因为入队的人如果有队友的话,会优先进入团体队列. 所以我们先设置两个队列和一个map,设置map倒是可以不用 ...
- 团体队列(Team Queue,UVA 540)
题目描述 思路 两类队列,一类是团队的整体队列,此队列存放的是团队的编号,另一类是一个团队一个队列,此队列存放的是队员的编号 DEQUEUE操作:首先根据整体队列,找到第一个团队编号,根据团队编号确定 ...
- 解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决
题目大意: 读入n个字符串,按字典序排序,再按列优先输出,附加条件每行最多输出60个字符,在此条件下要求行最少.(最开始没仔细看题,以为在一行中,每个单词相隔最长单词的长度+2,最后一列单词空间长度为 ...
- (~解题报告~)L1-017 到底有多二 (15分)(16行代码AC)
立志用更少的代码做更高效的表达 一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字-131 ...
- 25行代码AC——习题5-7 打印队列(Printer Queue,UVa 12100)——解题报告
励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-12100 题目描述: 我们需要用打印机打印任务.每个任务都有1~9间的优先级,优先级越高,任务越急. 打印机的运作方式:从打印队列里取出一 ...
- 31行代码AC——PTA 求二叉树的叶子结点个数 (20分)——解题报告
励志用尽量少的代码做高效的表达. 以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数. 输入格式: 输入二叉树的先序序列. 提示:一棵二叉树的先序序列是一个字符串,若字符是'#',表示该二叉树是空 ...
- 解题报告——例题5-5 集合栈计算机 UVa12096
五个操作: 1.PUSH:空集{}入栈 2.DUP:当前栈顶元素复制一份在入栈 3.UNION:出栈两个集合,然后把二者的并集入栈 4.INTERSECT:出栈两个元素,然后把二者的交集入栈 5.AD ...
- 解题报告——试题 基础练习 分解质因数——31行代码AC
励志用少的代码做高效的表达 储备知识: 1.预处理: 预处理的意思是将可能用到的数据先行处理,形成一张表,如果想要调用某个数,直接去表里查找. 2.筛选法: 筛选法是预处理的一种. 一般用筛选法来求某 ...
- [LeetCode解题报告] 365. 水壶问题
[LeetCode解题报告] 365. 水壶问题 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描 ...
最新文章
- Flutter开发之认识Flutter(二)
- Spring Security 5.5发布,正式实装OAuth2.0的第五种授权模式
- C#二进制格式与文件相互转换
- keycode对照表(键码对照表)
- Effective C++学习第六天
- php 预览器,浏览器html代码快速预览小工具
- ASP.NET程序中常用的三十一种代码
- pycharm调节字体大小
- html写法影响加载,html加载顺序以及影响页面二次渲染额的因素
- PLC和工控机有什么关系?
- 排序算法之时间复杂度O(n2)
- 百度排名批量查询_企业网站核心关键词排名消失,什么原因?
- 如何配置QQ邮箱或腾讯企业邮箱发送邮件
- 百面机器学习 之 集成学习
- 微信支付宝多商户解决方案
- 电脑怎么压缩图片大小,4个通用方法分享
- S32K116调试记录(1)SWD接口调试
- Android 录制桌面视频 screenrecord
- 计算机网络安全国际会议,2021年计算机网络安全与软件工程国际学术会议(CNSSE 2021)...
- 选择游戏服务器需要什么配置?