约瑟夫问题详解

2023-11-18

约瑟夫问题:

有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?

暴力

题目传送门

暴力都想不到就真是让人折服了。

暴力的话大模拟即可,不是重点,贴份代码就算了。

#include <cstdio>

int n,k;
struct node{
	int x;
	node *next;
	node(int c):x(c),next(NULL){}
};
node *first=NULL;

int main()
{
	scanf("%d %d",&n,&k);
	node *last=new node(1);
	first=last;
	for(int i=2;i<=n;i++)
	last->next=new node(i),last=last->next;
	last->next=first;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<k;j++)
		last=first,first=first->next;
		printf("%d ",first->x);
		last->next=first->next;
		first=first->next;
	}
}

进阶

题目传送门

这是进阶版的约瑟夫问题。

显然 O ( n k ) O(nk) O(nk) 的暴力无法满足我们的需要,所以我们要用更加优秀的做法。

发现这题和前一题有一个区别——不需要输出每次谁死了,也就是说,我们只关心最后谁活了下来。

为了方便,我们设一开始的 n n n 个人的编号为 0 0 0 ~ n − 1 n-1 n1

那么把第 k k k 个人干死之后(注意,第 k k k 个人的编号应该是 k − 1 k-1 k1),队伍变成了: k , k + 1 , k + 2 , ⋯ &ThinSpace; , n − 2 , n − 1 , 0 , 1 , ⋯ k,k+1,k+2,\cdots,n-2,n-1,0,1,\cdots k,k+1,k+2,,n2,n1,0,1,

然后会从第 k k k 个人那里重复上面的过程。那么不妨将他们重新编号,使每个人的编号都减去 k k k,那么编号变成: 0 , 1 , 2 , ⋯ &ThinSpace; , n − 3 , n − 2 0,1,2,\cdots,n-3,n-2 0,1,2,,n3,n2

那么现在就变成了一个 n − 1 n-1 n1 阶的约瑟夫问题,假设我们知道 n − 1 n-1 n1 阶约瑟夫问题的解(也就是最后谁会活下来),那么将这个解——即活下来的人的编号—— + k +k +k,就可以得到 n n n 阶约瑟夫问题的解了。

那么 n − 1 n-1 n1 阶约瑟夫问题的解从哪里知道呢?从 n − 2 n-2 n2 阶约瑟夫问题的解那里得到。于是就得到了一个 O ( n ) O(n) O(n) 的递推做法。

得到答案之后,还要 + 1 +1 +1,因为我们是从 0 0 0 开始编号的,然而题目要求从 1 1 1 开始编号。

0 0 0 开始编号是为了方便取模运算。

代码如下:

#include <cstdio>

int n,k;

int main()
{
	scanf("%d %d",&n,&k);
	int ans=0;
	for(int i=1;i<=n;i++)
	ans=(ans+k)%i;
	printf("%d",ans+1);
}

再进阶

题目传送门

发现这题的 n n n 变得巨大, O ( n ) O(n) O(n) 的优秀递推都会凉凉。

但是这题的 k k k 特别小,只有 1000 1000 1000,这就是这题的突破口了。

假如像上面一样枚举 i i i 的话,发现 i i i 大起来之后,很多时候 a n s + k ans+k ans+k 之后依然小于 i i i,也就是说,此时对 i i i 取模跟没取模的值是一样的,就是不需要进行取模,也就是说,每次可以直接加若干个 k k k,然后再对此时的 i i i 进行取模。

那么怎么知道每次要加多少个 k k k 呢?仔细想想,其实这就是一个追击问题:

a n s ans ans 每次加 k k k i i i 每次加 1 1 1,问多少次之后 a n s ≥ i ans\geq i ansi

那么这个就是一个简单的追击问题,然后模拟即可,这样的话程序就跑的飞快了。

代码如下:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long

ll n,k;

int main()
{
	scanf("%lld %lld",&n,&k);
	ll i=1,ans=0,p;
	//本来i应该从0开始,但是0需要特判掉,懒得打特判,于是从1开始
	while(i<n)
	{
		p=(i-ans)/(k-1)+((i-ans)%(k-1)!=0);//距离 除以 速度的差 得到 时间
		//但是因为这里是整除,所以如果(i-ans)不是(k-1)的倍数的话,还需要多走一次,这个想想就能明白
		if(i+p>n)p=n-i;//要判断是否大于n
		ans+=p*k;//ans走
		i+=p;//i走
		ans%=i;//取模
	}
	printf("%lld",ans+1);//别忘了+1
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

约瑟夫问题详解 的相关文章

  • node.js升级报错digital envelope routines unsupporte最简单解决方案

    背景 本地将nodejs 16升级成nodejs18运行时报错digital envelope routines unsupported 报错 Error error 0308010C digital envelope routines u
  • cytoscape插件下载_cytoscape五步曲之三:安装各种插件

    软件安装我就不多说了 直接去官网下载即可 请务必下载3 x版本 我讲的是 最新版教程 本次讲解如何给cytoscape安装插件 cytoscape本身是一个平台 学者可以在上面开发各种各样功能的插件实现不同的分析需求 类似于R语言这个平台
  • mysql中varbinary什么意思_MySQL中的数据类型binary和varbinary详解

    前言 BINARY和VARBINARY与 CHAR和VARCHAR类型有点类似 不同的是BINARY和VARBINARY存储的是二进制的字符串 而非字符型字符串 也就是说 BINARY和VARBINARY没有字符集的概念 对其排序和比较都是
  • 当我被酱香拿铁刷屏后......

    这两天 朋友圈刮起了酱香风 跨界里的新宠儿酱香拿铁卖爆了 不得不说瑞幸是懂跨界的 短短一天时间 酱香拿铁已售出 542 万杯 销售额超一亿元 谁能想到年轻人的第一杯茅台竟然是瑞幸卖出去的 这可能也是星巴克最无语的一天吧 瑞幸的订单长到可以直
  • python多进程cpu的占用率很低_Python 中的进程池与多进程

    封面图片来源 沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务 就开启多少个进程 实际上并不划算 由于计算机的 cpu 个数是非常有限的因此开启的进程数量完全和 cpu 个数成
  • LOAM算法详解

    激光SLAM 帧间匹配方法 Point to Plane ICP NDT Feature based Method 回环检测方法 Scan to Scan Scan to Map LOAM创新点 定位和建图的分离 里程计模块 高频低质量的帧
  • 在pycharm中更新pip失败

    尝试了网上的各种方法 各种翻车 删除虚拟环境中的这两个文件夹 包括pip 有只删除pip 21 1 2 dist info这个个文件夹然后重新安装pip之后在更新 我试了没有用 下载 get pip py 文件 转到 https boots
  • drive数据集_英伟达的最强人脸GAN开源了,它吃的高清数据集也开源了

    栗子 假装发自 凹非寺 量子位 出品 公众号 QbitAI 你大概还没忘记 英伟达去年年底推出的GAN 它合成的人脸甚至骗得过肉眼 如今 它终于有了自己的名字 叫StyleGAN 顾名思义 GAN的生成器 是借用风格迁移的思路重新发明的 能
  • Docker 入门笔记

    狂神说Java Docker最新超详细版教程通俗易懂 视频地址 https www bilibili com video BV1og4y1q7M4 share source copy web Docker安装 基本组成 说明 镜像 imag
  • 小米2020校招软件开发工程师笔试题二

    1 计算大于n n gt 1 的最小的斐波那契数 以下划线出应填入 B function f n int int a new int 2 a 0 a 1 1 int i 1 while true i i 1 2 a i If a i gt
  • C++标准库--正态分布类 std::normal_distribution

    参考链接 https en cppreference com w cpp numeric random normal distribution std normal distribution是C 11提供的一个正态分布函数模板类 头文件 i
  • 在matlab中使用遗传算法执行最优化

    遗传算法是一种通用的最优化方法 具体原理可以看 遗传算法详解与实验 下面记录在Matlab中如何使用遗传算法来做优化 用法 调用方式如下 1 x ga fun nvars 2 x ga fun nvars A b 3 x ga fun nv
  • webpack之sideEffects

    webpack之sideEffects 前言 一 sideEffects的使用 二 sideEffects注意事项 前言 webpack4新增了一个sideEffects新特性 它允许我们通过配置的方式 去标识我们的代码是否有副作用 从而为
  • 云计算的概念、原理和关键技术

    1 云计算的定义 NIST 美国国家标准及技术研究所 对云计算的定义 云计算是一种模型 实现无处不在的 方便 通过网络按需访问的可配置的共享计算资源池 例如 网络 服务器 存储 应用程序 服务 这些资源可以快速提供 通过最小化管理成本或与服
  • jsp下读取c:forEach的循环次数,以及内部循环数据累加统计等

    前言 近日接触到一个比较旧的项目 框架使用的是Status2 Spring3 前端jsp大量内嵌了java代码 几乎未使用jstl和el表达式 个人习惯原因 已经很不喜欢使用这种通过写java代码在jsp上做逻辑控制的方式 很不好让别人读代
  • input checkbox js控制单选

    html中checkbox的格式如下 div div div div
  • 随笔之---java版本哲学家就餐问题【信号量的实现】

    很喜欢这样的描述如果你喜欢也不防读一读 从许多许多年前 石头就呆在那座岭上了 那是座无名的低岭 毫不起眼 没有足以称道的风景名胜 那块石头只是许多石头中的一颗 见证过日升日落 经历过沧海桑田 承受四季变迁 黄河水数度从它的身上淹没而过 人群
  • 【你哥电力电子】THE BUCK 降压斩波电路

    BUCK电路 2022年12月25日 nige in Tongji University elecEngeneer 文章目录 BUCK电路 1 BUCK电路来源 2 CCM下的理想稳态分析 2 1 分析流程 3 DCM下的理想稳态分析 3
  • 解决win11能使用微信qq但是不可以使用浏览器上网的问题

    百度找了好多教程都是让修改dns首选地址的 这种一般是win10的解决方式 下面将win11遇到这个问题的解决方式贴到下面 wifi连接正常 且微信qq可以使用 解决方式如下 最后将这个代理服务器关掉即可

随机推荐

  • Python自然语言处理学习笔记(18):3.2 字符串:最底层的文本处理

    转载请注明出处 一块努力的牛皮糖 http www cnblogs com yuxc 新手上路 翻译不恰之处 恳请指出 不胜感谢 Updated log 1st 2011 8 6 3 2 Strings Text Processing at
  • Python自学笔记3-数据类型

    Python支持的数值类型包括 名称 功能 int 整数 long 长整型 float 实数型 complex 复数 示例代码 1 2 3 4 5 6 7 8 9 10
  • Python:os.walk() 获取指定文件夹下所有的文件绝对路径【包含层级目录】

    代码参数详解 import os 遍历打印指定文件夹下所有的文件名称 dirPath 指定遍历的文件夹路径 def listFiles dirPath 准备一个空列表 用来存储遍历数据 fileList os walk dirPath 走查
  • 设置vim 永久显示行号

    在linux环境下 vim是常用的代码查看和编辑工具 在程序编译出错时 一般会提示出错的行号 但是用vim打开的代码确不显示行号 错误语句的定位非常不便 那么怎样才能让vim显示代码的行号呢 1 临时显示行号 如果只是临时显示vim的行号
  • Error in createDataPartition(...):y must have at least 2 data points

    项目场景 在R中使用caret包 划分训练集和测试集时 出现错误Error in createDataPartition data OS STATUS p 0 5 list FALSE y must have at least 2 data
  • pytorch 多类分割损失 (Generalized Dice Loss)

    引自该文章python 常用函数和自定义函数整理 2 Pytorch相关处理 Generalized Dice Loss相关代码 如有错误 烦请指正 多类分割dice损失 def generalized dice loss pred tar
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • 电子学会 青少年软件编程(C语言)等级考试二级 训练题汇总

    一 NOI题库 1 6编程基础之一维数组 OpenJudge OpenJudge 题目 1 7编程基础之字符串 OpenJudge OpenJudge 题目 1 8编程基础之多维数组 OpenJudge OpenJudge 题目 1 9编程
  • cookie、session、token的概念以及区别

    http链接都是无状态的 即是说浏览器无法判断这一次登陆和上一次登陆有没有关联 所以引入cookie和session的概念 让http可以判断你是否曾登陆过 cookie Cookie是客户端保存用户信息的一种机制 用来记录用户的一些信息
  • 一次内核hung task分析

    http blog chinaunix net uid 14528823 id 4406510 html 1 内核hung task检测机制由来 我们知道进程等待IO时 经常处于D状态 即TASK UNINTERRUPTIBLE状态 处于这
  • python读取csv中所遇到的中文编码问题

    由于本人准备学习使用一些机器学习算法 第一个是DecisionTree 然后使用到了西瓜案例 因为涉及到讨厌的编码问题 所以找了好多办法去尝试读取csv文件 1 pandas pandas可谓是神奇 用python学习机器学习不可缺少的一个
  • 如何解决WIN10中,进入本地组策略时出现“命名空间已经被定义为存储中另一文件的目标命名空间”

    1 首先 怎么打开组策略 win R gpedit msc 回车 2 当打开组策略时出现如下的提示 当然关闭后还是可以正常使用的 只是如何去掉该提示呢 3 解决办法 引起该问题的原因就是提示的C WINDOWS PolicyDefiniti
  • Linux脚本启动jar包

    这里主要为shell脚本启动部署在服务器中jar包 bin bash 这里可替换为你自己的执行程序 其他代码无需更改 APP NAME demo jar 使用说明 用来提示输入参数 usage echo Usage sh demo sh s
  • Android上层与驱动交互完整篇(二)Hal层篇

    Android上层与驱动交互完整篇 二 Hal层篇 上篇写了I2C驱动如何来编写 但是驱动里并没有交代如何具体的跟设备通信 现在我们在hal层实现这部分逻辑代码 HAL全称Hardware Abstract Layer 硬件抽象层 它向下屏
  • 基于改进二进制粒子群算法的电力系统机组组合——复现

    目录 文章摘要 研究背景 二进制粒子群算法 代码运行效果 本文代码分享 文章摘要 提出了1种改进的BS0 二进制粒子群 方法求解机组组合问题 首先 利用优先顺序法确定初始的机组组合 根据这个结果 确定优化窗口的范围 在此范围内利用BPSO进
  • WebLogic-执行队列

    一 Tuning the Application Server 二 执行队列 Using Work Managers to Optimize Scheduled WorkThis chapter describes how WebLogic
  • K-近邻算法

    一 K 近邻算法 1 介绍 K 近邻算法 K Nearest Neighbor 又叫KNN算法 指如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别 则该样本也属于这个类别 也就是对于新输入的实例 从数据集中找到于该实例最邻
  • Ubuntu:停掉某个网络

    ifconfig 网口名 down 例子如下 ifconfig docker0 down
  • 163_omnicore升级后无法连接

    qq群里转载的 最近由于omnicore要升级 每个要升级的人都在问rpc怎么连不了了 这里统一回复下 1 为什么连不了 这是bitcoin0 18 0更改了rpcallowip自动侦听的功能 必须使用rpcbind指定要侦听的ip 2 怎
  • 约瑟夫问题详解

    约瑟夫问题 有n个人 编号为1 n 从第一个人开始报数 从1开始报 报到m的人会死掉 然后从第m 1个人开始 重复以上过程 在死了n 1个人后 问最后一个人的编号是 暴力 题目传送门 暴力都想不到就真是让人折服了 暴力的话大模拟即可 不是重