当前位置: 首页 > news >正文

题解:洛谷 P1996 约瑟夫问题

【题目来源】

洛谷:P1996 约瑟夫问题 - 洛谷

【题目描述】

\(n\) 个人围成一圈,从第一个人开始报数,数到 \(m\) 的人出列,再由下一个人重新从 \(1\) 开始报数,数到 \(m\) 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

【输入】

输入两个整数 \(n,m\)

【输出】

输出一行 \(n\) 个整数,按顺序输出每个出圈人的编号。

【输入样例】

10 3

【输出样例】

3 6 9 2 7 1 8 5 10 4

【算法标签】

《洛谷 P1996 约瑟夫问题》 #模拟# #树状数组# #队列# #链表#

【代码详解】

// 使用树状数组实现
#include <bits/stdc++.h>
using namespace std;const int N = 105;  // 最大人数int n, m;          // n: 总人数, m: 报数间隔
int tr[N];         // 树状数组,用于标记人员是否在场(1=在场,0=已出列)/*** 计算lowbit:获取x的最低位的1* @param x 输入数值* @return x的最低位的1所代表的值*/
int lowbit(int x)
{return x & -x;  // 利用补码性质
}/*** 树状数组单点更新操作* @param x 更新位置* @param c 增加的值*/
void add(int x, int c)
{// 树状数组标准更新操作for (int i = x; i <= n; i += lowbit(i))tr[i] += c;
}/*** 树状数组前缀和查询操作* @param x 查询位置* @return 前x个位置中在场人员的数量*/
int query(int x)
{int res = 0;// 树状数组标准查询操作for (int i = x; i; i -= lowbit(i))res += tr[i];return res;
}/*** 查找第k个在场人员的位置* @param k 要找的第k个在场人员* @return 第k个在场人员的实际位置*/
int find(int k)
{int l = 1, r = n;  // 二分查找边界int ans;           // 存储查找结果// 二分查找:找到前缀和>=k的最小位置while (l <= r){int mid = (l + r) >> 1;  // 计算中点if (query(mid) >= k){ans = mid;      // 记录当前位置r = mid - 1;    // 继续向左查找更小的满足条件的位置}else {l = mid + 1;    // 向右查找}}return ans;
}int main()
{// 输入总人数和报数间隔cin >> n >> m;// 初始化:所有人都在场for (int i = 1; i <= n; i++) add(i, 1);int pos = 1;  // 当前位置指针,从第1个人开始// 循环n次,每次出列一个人for (int i = 1; i <= n; i++){// 计算剩余人数int rem = n - i + 1;// 计算下一个出列人员的位置(约瑟夫环公式)int k = (pos + m - 1) % rem;  // 从当前位置开始数m个人if (k == 0) k = rem;  // 如果余数为0,则取最后一个// 找到第k个在场人员的实际位置int target = find(k);// 输出出列人员cout << target << " ";// 标记该人员已出列add(target, -1);// 更新当前位置指针为当前出列位置pos = k;}return 0;
}

【运行结果】

10 3
3 6 9 2 7 1 8 5 10 4 
http://www.jsqmd.com/news/390158/

相关文章:

  • Mac mini 带回老家,打算用远程控制,第一次开机我傻眼了
  • 2026硅酸钾领域佼佼者:盘点几家实力企业,硅微粉/石英粉/铸石粉/石英砂/石墨粉/玻璃纤维布,硅酸钾生产厂家哪家好 - 品牌推荐师
  • AI率失真:为什么你永远测不出一段文字是不是AI写的
  • 2026年专业的保健品品牌选哪家?看这篇就懂,保健品/保健饮品/养胃颗粒,保健品品牌选哪家 - 品牌推荐师
  • 2026市面上热门不锈钢筛网公司,哪个更胜一筹?混合机/旋振筛/真空上料机/不锈钢筛网,不锈钢筛网实力厂家排行榜 - 品牌推荐师
  • 2026靠谱的郭氏正骨在哪?排行榜为你揭秘,郭氏正骨,郭氏正骨生产厂家哪个好 - 品牌推荐师
  • MySQL大表DDL的最佳实践 - 详解
  • 抗衰老保健品怎么选?2026年热门口碑产品推荐,保健品/抗衰老片,抗衰老保健品食品推荐排行榜 - 品牌推荐师
  • 江苏车铣复合培训择校攻略:聚焦学校口碑与实力,SolidWorks培训/非标机械设计培训,车铣复合培训机构推荐排行榜 - 品牌推荐师
  • 我发明的 C++「数据注入模型(DWM)」:比构造函数更规范、更专业的结构体创建写法
  • 题解:洛谷 P1449 后缀表达式
  • 【GitHub项目推荐--OpenAkita:自我进化的开源AI助手框架】⭐⭐⭐
  • Java8 有哪些新特性?
  • 【GitHub项目推荐--ZeroClaw:零开销、零妥协的Rust原生AI助手基础设施】⭐⭐⭐
  • Java 方法重载和方法重写之间的区别是什么?
  • 什么是 Java 内部类?它有什么作用?
  • Java 面向对象编程与面向过程编程的区别是什么?
  • sdut-Java面向对象-05 类和对象(函数题:12-22题)完整教程:从入门到实战部署
  • 深入理解AVL树:从概念到完整C++实现详解 - 教程
  • 想选专业保健品品牌?2026年这些值得关注!保健饮品/养胃颗粒/保健品,保健品品牌推荐排行榜 - 品牌推荐师
  • 校园失物招领|基于Python + Django校园失物招领系统(源码+数据库+文档)
  • 想选江苏口碑好的车铣复合培训职校?2026年选择攻略来了,车铣复合培训/非标机械设计培训,车铣复合培训职业学校口碑排行 - 品牌推荐师
  • 学生信息管理|基于Python + Django学生信息管理系统(源码+数据库+文档)
  • 题解:洛谷 P1825 [USACO11OPEN] Corn Maze S
  • 仓库管理|基于Python + Django仓库管理系统(源码+数据库+文档)
  • 智慧社区|基于Python + Django智慧社区系统(源码+数据库+文档)
  • 从大模型到场景应用如何破解AI“最后一公里”难题?
  • 酒店客房管理|基于Python + Django酒店客房管理系统(源码+数据库+文档)
  • 小白程序员必看:注意力机制的革命性演进与大模型学习指南
  • 学生宿舍管理|基于Python + Django学生宿舍管理系统(源码+数据库+文档)