news 2026/4/23 13:28:06

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/4/18 10:03:33

游戏存档管理神器:一键备份恢复你的游戏进度

游戏存档管理神器&#xff1a;一键备份恢复你的游戏进度 【免费下载链接】Game-Save-Manager Easily backup and restore your game saves anytime 项目地址: https://gitcode.com/gh_mirrors/gam/Game-Save-Manager 在游戏世界中&#xff0c;每一刻的进度都凝聚着你的心…

作者头像 李华
网站建设 2026/4/23 12:34:24

ANSYS2025R2安装图解:小白也能一次成功

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式ANSYS安装引导程序&#xff0c;功能&#xff1a;1.分步骤3D动画演示安装过程 2.实时错误预防提示(如磁盘空间不足警报) 3.关键操作确认机制 4.安装完成后的简易测试…

作者头像 李华
网站建设 2026/4/23 11:15:23

传统vs现代:解决DLL问题效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个效率对比工具&#xff0c;能够模拟传统手动解决UCRTBASED.DLL问题的步骤&#xff08;如手动下载、注册等&#xff09;和现代自动化解决方案。工具需要&#xff1a;1) 记录…

作者头像 李华
网站建设 2026/4/23 12:56:24

Qwen2.5-7B体验报告:云端GPU成本实测,1小时仅1块

Qwen2.5-7B体验报告&#xff1a;云端GPU成本实测&#xff0c;1小时仅1块 1. 为什么选择Qwen2.5-7B&#xff1f; 作为技术博主&#xff0c;我经常需要测试各种AI模型&#xff0c;但最头疼的就是云服务的隐形消费问题。很多平台看似便宜&#xff0c;实际使用时却因为各种附加费…

作者头像 李华
网站建设 2026/4/23 12:34:19

SpringAI入门:零基础搭建你的第一个AI生成项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 为Spring初学者生成一个简单的待办事项管理应用&#xff0c;要求&#xff1a;1. 使用最简Spring Boot配置&#xff1b;2. 实现CRUD操作&#xff1b;3. 包含基础前端页面&#xff1…

作者头像 李华
网站建设 2026/4/16 14:09:45

3大核心优势:为什么ASN.1 C编译器是二进制数据处理的首选?

3大核心优势&#xff1a;为什么ASN.1 C编译器是二进制数据处理的首选&#xff1f; 【免费下载链接】asn1c The ASN.1 Compiler 项目地址: https://gitcode.com/gh_mirrors/as/asn1c 在当今数据驱动的时代&#xff0c;高效处理二进制数据已成为开发人员面临的重要挑战。A…

作者头像 李华