POJ 2259 team queue团队排队问题
发布日期:2021-07-01 03:39:28
浏览次数:2
分类:技术文章
本文共 2979 字,大约阅读时间需要 9 分钟。
题目链接:
题目大意:
告诉你一堆人(m个人是一组的,n个人是一组的。。。。);然后一个人来排队了,先看下有自己组的熟人吗?有的话直接排在自己组的人的队尾(呵呵,是不是现实中有这样的),没有熟人的话直接排队尾咯。
题目给定进队和出队命令,求解出队的顺序。思路:
- 每个组需要有一个队列
queue<int> team[teamIndex]
- 每个组需要一个标记,我们组是否有人 true,false
bool teamInQueue[teamIndex]
- 每个人与组号之间的映射
people[peopleID]=teamIndex
- 如果组的标记为 true,再把组的序号存成大的队列
queue<int> mainQueue
- 入队:检查人ID是哪个组的;check组号的标记,知道组是否在大队 mainQueue里,true,则在该组入队,false,则把自己组的标记改成 true,并把自己的组号压入大队 mainQueue里,并且自己入队该组
- 出队:找到 mainQueue里的 front是哪个组的组号,从该组打印ID并出队;检查该组还有人吗,如果没人了,把该组组号从 mainQueue里出队,并把该组的标记改成false
Accepted 代码如下:
/** * @description: poj2259 团队排队问题 * @author: michael ming * @date: 2019/4/5 11:24 * @modified by: */#include#include #include using namespace std;#define MAX 1000#define MAX_PEOPLE 1000000queue team[MAX]; //team[i]代表一个组队列queue mainQueue; //宏观主队列,存储teamIndex值bool teamInQueue[MAX]; //队伍是否排在主队列中int people[MAX_PEOPLE]; //存储人的队伍teamIndex编号int teamNums, Scenario=1;void init() //每次进入下一次任务时,清空前一次的记录{ for(int i = 0; i < teamNums; ++i) //队列清空 { teamInQueue[i] = false; while(!team[i].empty()) team[i].pop(); } while(!mainQueue.empty()) mainQueue.pop();}void input() //输入人员信息,及记录每人的组号{ int totalPeopleInTeam,peopleID; for(int teamIndex = 0; teamIndex < teamNums; ++teamIndex) { cin >> totalPeopleInTeam; for(int j = 0; j < totalPeopleInTeam; ++j) { cin >> peopleID; people[peopleID] = teamIndex; //把每个人的ID(数组中的位置)与其值(组号)建立映射 } }}void solve(){ int peopleID,teamID; string command; cout << "Scenario #" << Scenario++ << endl; while(cin >> command && command[0] != 'S') //STOP停止 { if (command[0] == 'E') //ENQUEUE入队 { cin >> peopleID; //输入ID后查询其组号teamID(即people[peopleID]) teamID = people[peopleID]; if(teamInQueue[teamID]) //组号是否在大队列里呢(初始为false不在) { team[teamID].push(peopleID); //找到我的组入组 } else //我组没人,我是第一个 { teamInQueue[teamID] = true; //我们组终于有人了 mainQueue.push(teamID); //我们组的组号排在最后一组 team[teamID].push(peopleID); //找到我的组入组 } } else //DEQUEUE出队 { if(!mainQueue.empty()) //大团组必须还有,如果无,则完全没人了 { teamID = mainQueue.front(); //队头是哪个组的呀 cout << team[teamID].front() << endl; //从相应的组里找到该组的头 team[teamID].pop(); //打印了,出队 if(team[teamID].empty()) //这个组空了,都出去了 { teamInQueue[teamID] = false; //标记一下 mainQueue.pop(); //从大队里删除空组 } } } } cout << endl;}int main(){ while(cin >> teamNums && teamNums) { init(); //初始化组的标记,及清空队列 input(); //输入人员ID,记录人员组号 solve(); //队列出队,入队操作 } return 0;}
转载地址:https://michael.blog.csdn.net/article/details/89043659 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年05月02日 19时43分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Netty hello world 入门源码分析
2021-07-06
Netty 中的 handler 和 Pipeline
2021-07-06
ActiveReports 报表应用教程 (15)---报表换肤
2021-07-06
ActiveReports 报表应用教程 (14)---数据可视化
2021-07-06
在Silverlight中动态绑定页面报表(PageReport)的数据源
2019-05-03
阿里 java 后台开发面经,经过5轮面试虽然失败了但还是收获很多(21 届秋招)
2019-05-03
JVM字节码指令集,寄存器,栈(方法栈和本地方法栈),垃圾回收详解
2019-05-03
博主真会玩,Spring单例bean中使用多例bean,你未必会玩?
2019-05-03
阿里与华为的多线程面试题是怎么样的?你知道现在的面试有多难吗???
2019-05-03
RocketMQ 整体架构设计,进阶必看的 RocketMQ,看这篇就够了!
2019-05-03
很多Java 老手都说不清,但能说清楚这四个概念的一定是Java老手。
2019-05-03
失误等于失业看看Spring Boot内存泄露,排查竟这么难!
2019-05-03
spring-boot 项目为例,Spring Validation最佳实践及实现原理
2019-05-03
Java使用Stream求对象集合的交集、差集详解
2019-05-03
Redis缓存穿透,雪崩,击穿以及解决方案分析(2021年超详细版)
2019-05-03
面试必杀技:Spring循环依赖居然还有人讲不清楚?
2019-05-03
JAVA RMI技术及其spring封装的使用
2019-05-03
并发编程经历:同步加锁之业务锁
2019-05-03
Spring Cloud Zuul中使用Swagger汇总API接口文档
2019-05-03