news 2026/6/15 20:55:21

133 The Dole Queue

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
133 The Dole Queue

题目描述

本题模拟了一个裁员队列的过程。NNN个申请人围成一个圆圈,从编号111开始逆时针编号到NNN。每天,两位官员分别从编号111(逆时针方向)和编号NNN(顺时针方向)开始数人。一位官员每次数kkk个有效申请人(跳过已被选中的人),另一位官员每次数mmm个有效申请人。被选中的两个人将同时离开圆圈(如果两人选中同一人,则该人仅离开一次)。重复此过程,直到所有人都被选中。要求按离开的顺序输出编号,每对编号(或单独编号)占333字符宽,用逗号分隔,末尾不加逗号。

输入格式
多组数据,每组一行三个整数N,k,mN, k, mN,k,m,满足k,m>0,0<N<20k, m > 0, 0 < N < 20k,m>0,0<N<20。以0 0 0结束输入。

输出格式
对每组数据,输出一行,表示离开顺序,格式如上所述。

样例输入

10 4 3 0 0 0

样例输出

4 8, 9 5, 3 1, 2 6, 10, 7

解题思路

本题是一个典型的约瑟夫环问题的变种,区别在于有两个方向同时进行数人,且每次选中的两人同时离开。由于N<20N < 20N<20,数据规模很小,可以直接用数组模拟整个过程。

关键点分析

  1. 模拟圆圈
    使用数组circle存储当前还在圈中的人的编号,被选中的人将其值置为000表示离开。

  2. 数人逻辑

    • 逆时针方向(从当前位置right开始,数kkk个有效的人)
    • 顺时针方向(从当前位置left开始,数mmm个有效的人)
      由于选中的人会离开,所以数人时需要跳过值为000的位置。
  3. 同时离开
    如果两个官员选中同一个人,只输出一次,并且只将nnn减少111;否则分别输出并减少222

  4. 输出格式
    使用setw(3)控制输出宽度为333字符,用逗号分隔不同对(或单独编号),注意末尾没有逗号。


算法步骤

  1. 读入N,k,mN, k, mN,k,m,若全为000则结束。
  2. 初始化数组circle111NNN
  3. 设置两个指针rightleft,分别表示逆时针和顺时针的起始位置。
  4. 当还有人未离开时:
    • right开始逆时针数kkk个有效位置,更新right为选中位置。
    • left开始顺时针数mmm个有效位置,更新left为选中位置。
    • 输出circle[right](占333字符),将其置000,剩余人数减一。
    • 如果right != left,输出circle[left](占333字符),将其置000,剩余人数再减一。
    • 如果还有人剩余,输出逗号。
  5. 输出换行,处理下一组数据。

代码实现

// The Dole Queue// UVa ID: 133// Verdict: Accepted// Submission Date: 2015-12-13// UVa Run Time: 0.000s//// 版权所有(C)2015,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intn,k,m;vector<int>circle;// count off in counter-clockwise and return the index of target.intfindCCW(intright,intnumber){for(inti=right;i<circle.size();i++)if(circle[i]>0&&((--number)==0))returni;while(true){for(inti=0;i<circle.size();i++)if(circle[i]>0&&((--number)==0))returni;}}// count off in clockwise and return the index of target.intfindCW(intleft,intnumber){for(inti=left;i>=0;i--)if(circle[i]>0&&((--number)==0))returni;while(true){for(inti=circle.size()-1;i>=0;i--)if(circle[i]>0&&((--number)==0))returni;}}intmain(){setfill(' ');while(cin>>n>>k>>m,n||k||m){circle.clear();for(inti=1;i<=n;i++)circle.push_back(i);intright=0,left=n-1;while(n>0){right=findCCW(right,k);left=findCW(left,m);cout<<setw(3)<<circle[right];circle[right]=0;n--;if(right!=left){cout<<setw(3)<<circle[left];circle[left]=0;n--;}if(n>0)cout<<",";}cout<<endl;}return0;}

复杂度分析

  • 时间复杂度:每次数人最多遍历整个数组,总复杂度为O(N2)O(N^2)O(N2),由于N≤20N \leq 20N20,完全可行。
  • 空间复杂度:O(N)O(N)O(N)

总结

本题是一个有趣的模拟题,关键在于理解两个方向同时数人的逻辑,并处理好选中同一人的特殊情况。输出格式要求较严格,注意使用setw控制宽度和逗号的位置即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 18:00:37

如何快速下载B站高清视频:bilidown完整使用教程

如何快速下载B站高清视频&#xff1a;bilidown完整使用教程 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具&#xff0c;支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析&#xff0c;可扫码登录&#xff0c;常驻托盘。 项目地址: https://gitcode.com/gh_mirrors/bi…

作者头像 李华
网站建设 2026/6/15 15:34:35

MySQL MCP备考:传统方法与AI辅助效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个MySQL MCP备考效率分析工具&#xff0c;功能包括&#xff1a;1. 三种备考方式的时间成本对比仪表盘&#xff1b;2. 知识点掌握进度追踪和预测&#xff1b;3. 智能学习路径…

作者头像 李华
网站建设 2026/6/15 18:06:49

Nextcloud插件开发终极指南:从零到部署的10个关键步骤

Nextcloud插件开发终极指南&#xff1a;从零到部署的10个关键步骤 【免费下载链接】server ☁️ Nextcloud server, a safe home for all your data 项目地址: https://gitcode.com/GitHub_Trending/se/server 想要为团队定制专属的Nextcloud功能&#xff1f;厌倦了现有…

作者头像 李华
网站建设 2026/6/15 11:58:46

Python机器学习实战:5个关键算法解决材料科学预测难题

Python机器学习实战&#xff1a;5个关键算法解决材料科学预测难题 【免费下载链接】Python All Algorithms implemented in Python 项目地址: https://gitcode.com/GitHub_Trending/pyt/Python 您是否曾经为材料性能预测的复杂性而困扰&#xff1f;&#x1f914; 面对海…

作者头像 李华
网站建设 2026/6/15 6:47:35

AI助力SVG图形生成:5分钟打造专业矢量图

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个基于AI的SVG图形生成工具&#xff0c;用户可以通过自然语言描述想要的图形&#xff08;如生成一个蓝色的圆形&#xff0c;半径50px&#xff0c;带有红色边框&#xff09;&…

作者头像 李华