news 2026/6/10 21:03:04

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/9 22:02:36

Qwen3-VL UI设计:从需求到代码生成指南

Qwen3-VL UI设计&#xff1a;从需求到代码生成指南 1. 背景与核心价值 1.1 视觉语言模型的演进需求 随着多模态AI在内容理解、智能代理和人机交互中的广泛应用&#xff0c;单一文本大模型已难以满足复杂场景下的综合推理需求。阿里推出的 Qwen3-VL 系列标志着视觉-语言融合能…

作者头像 李华
网站建设 2026/6/10 12:29:31

比cnpm更快:新一代智能NPM镜像加速方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个智能NPM镜像加速器&#xff0c;功能包括&#xff1a;1. 基于下载历史预测并预加载常用依赖&#xff1b;2. 自动选择最优CDN节点&#xff1b;3. 支持断点续传和并行下载&am…

作者头像 李华
网站建设 2026/6/10 12:32:14

DIFY如何将开发效率提升10倍

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个效率对比工具&#xff0c;展示使用DIFY与传统开发方式在时间、成本和错误率上的差异。工具应支持用户输入项目参数&#xff0c;自动生成对比报告&#xff0c;并提供可视化…

作者头像 李华
网站建设 2026/6/10 12:32:27

Qwen2.5-7B技术解析+体验:云端免安装,立即上手

Qwen2.5-7B技术解析体验&#xff1a;云端免安装&#xff0c;立即上手 引言&#xff1a;AI大模型的新选择 你是否遇到过这样的场景&#xff1a;想体验最新的大语言模型&#xff0c;却被复杂的安装部署过程劝退&#xff1f;或者作为技术博主&#xff0c;需要快速测试模型性能却…

作者头像 李华
网站建设 2026/6/10 19:02:13

如何快速部署Whisper-medium.en:开发者的终极语音识别配置指南

如何快速部署Whisper-medium.en&#xff1a;开发者的终极语音识别配置指南 【免费下载链接】whisper-medium.en 项目地址: https://ai.gitcode.com/hf_mirrors/openai/whisper-medium.en 在当今数字化浪潮中&#xff0c;精准的英语语音转文字技术正成为智能应用的核心竞…

作者头像 李华
网站建设 2026/6/10 20:14:19

Zonos语音合成技术深度解析与实战指南

Zonos语音合成技术深度解析与实战指南 【免费下载链接】Zonos Zonos-v0.1 is a leading open-weight text-to-speech model trained on more than 200k hours of varied multilingual speech, delivering expressiveness and quality on par with—or even surpassing—top TTS…

作者头像 李华