POJ 2259 team queue团队排队问题
发布日期:2021-07-01 03:39:28 浏览次数:2 分类:技术文章

本文共 2979 字,大约阅读时间需要 9 分钟。

题目链接:

题目大意:

告诉你一堆人(m个人是一组的,n个人是一组的。。。。);然后一个人来排队了,先看下有自己组的熟人吗?有的话直接排在自己组的人的队尾(呵呵,是不是现实中有这样的),没有熟人的话直接排队尾咯。

题目给定进队和出队命令,求解出队的顺序。
在这里插入图片描述

思路:

  1. 每个组需要有一个队列 queue<int> team[teamIndex]
  2. 每个组需要一个标记,我们组是否有人 true,false bool teamInQueue[teamIndex]
  3. 每个人与组号之间的映射 people[peopleID]=teamIndex
  4. 如果组的标记为 true,再把组的序号存成大的队列 queue<int> mainQueue
  5. 入队:检查人ID是哪个组的;check组号的标记,知道组是否在大队 mainQueue里,true,则在该组入队,false,则把自己组的标记改成 true,并把自己的组号压入大队 mainQueue里,并且自己入队该组
  6. 出队:找到 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ 1581 优先队列 priority_queue -- 比赛胜者求解
下一篇:数据结构--队列Queue--打印杨辉三角

发表评论

最新留言

关注你微信了!
[***.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
面试官三连问ShardingSphere-JDBC:你这个数据量多大?分库分表怎么做?用的哪个组件? 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