约瑟夫环(2012阿里笔试)

MySQL连接异常:Communications link failure 解决方案 困扰一晚上的问题终于解决了。 阅读详情

N 个数围城一个圈,编号从 1 - N; 给定步长m, 第一个数开始报1,数到 m的数被删除,下个数又从1开始报数,如此循环,直到剩下最后一个数。问最后一个数的编号是?


方法1: 当 m = 2的时候有通项,参见具体数学第一章,J(2^m+p) = 2p + 1 ,其中  0<=p<2^m, m 为N的二进制形式的最高次幂。用数学归纳法可以证明。

提示: J(2n) = 2J(n)-1;  J(2n+1)  = 2J(n) + 1; ,对m 归纳。

当 m > 2的时候不存在通项,只有个递推式。设,J(n)为最后一个数的编号。可知,n个数,第一个删除的数一定是 k = (m-1) % n + 1;  剩下n-1个数:

k+1, k+2, ...... n, 1, 2, ..... k-1  ;下一轮从 k+1 开始报数, 也就是说对应着 1,2,.... , n-1;这样就把原来的 求J(n) 转化为求 J(n-1);假设 J(n-1)=  x ,则把 x 对应回J(n)中的编号y即可, 其中, y = (x -1 + k) % n + 1; 把各个变量代入得到:  J(n) = [J(n-1) - 1 + (m-1)%n+1 ] % n + 1  = [J(n-1) + (m-1)%n ] % n + 1 = ( J(n-1) + m -1 ) % n + 1; 其中 J(1) = 1.于是递归算法可得:

#include <cstdlib>
#include <iostream>

using namespace std;

int josephus(int n,int m)
{
    if(n==1)
        return 1;
    return (josephus(n-1,m)+(m-1))%n+1;
}



int main(int argc, char *argv[])
{
    int n,m;
    while(n)
    {
        cin>>n>>m;
        cout<<josephus(n,m)<<endl;
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}


方法二: 模拟

/**
 *  author:小旦 2012-09-16
 *  暴力法
 */

#include <iostream>
using namespace std;

int K;
const int MAX = 16;
int arr[2 * MAX];
int GoodPNum,BadPNum,res;

void init()
{
	for(int i=1; i<=2*K; i++)  //下标为 1~2K标记为1,代表2K个人
		arr[i] = 1;
	GoodPNum = K;  //被杀之前,好人与坏人都是K个
	BadPNum = K;
}

void solve()
{
	int ModNum = 2 * K + 1;

	res = 2; //返回结果从2开始暴力
	int count,index;   //当count == res的时候,当前下标index的人被杀
	while(true)
	{
		count = 1;
		index = 1;  //遍历数组的下标
		while(true)
		{
			//下标溢出数组上界,则回到初始位置
			if( index == ModNum)
				index = 1;

			//当前所加次数需要杀一个人
			if(count == res)
			{
				count = 0;  //置零,重新开始加

				//开始杀人操作
				arr[index] = -1;
				//如果杀的是坏人
				if(index > K)
					BadPNum--;   //尚未被杀的坏人数减一
				else
					GoodPNum--;  //尚未被杀的好人数减一
				//判断是否找到解
				//坏人杀光了,好人还有剩
				if(BadPNum == 0)
				{
					cout<<res<<endl;
					return;
				}
				//好人杀光了,坏人还有剩
				else if(GoodPNum == 0)
					break; //当前解不是最优解,跳出最里层while
			}
			else {
				//将浮标指到下一个可以杀的人
				while(++index) {
					//下标溢出数组上界,则回到初始位置
					if( index == ModNum)
						index = index % ModNum + 1;
					//找到一个可以杀的人
					if(arr[index] == 1)
						break;
				}
				count++;
			}
		}
		res++; //上一个res值不符合答案,加一继续暴力
	}
}

int main()
{
	while(cin>>K) {
		init();
		solve();
	}
	return 0;
}


Qualcomm 常用NV列表 ^ NV ITEM ^ 功能^^ |NV10 |mode prefer,找网模式|新平台使用NV80000| ^NV74 NV74=0关闭自动接听电话^ |NV240 |NV240=FALSE|EVDO出现网络的问题,此项必须设定为FALSE| |NV255 |CDMA规避网络列表(SID/NID号)| |NV256 | 阅读详情

相关推荐

教你读懂techpoint视频解码芯片tp2855规格书(第一部分)

所有的控制环都是可编程的,以实现最大化的灵活性。对于NTSC/PAL输入,输出时钟和采样结构是非标准的,以便在多路复用输出时与HD格式一同工作。所有通道的音频数据都可以选择性地级联,以实现最大的灵活性。TP2855是一款通用的高清/标清视频解码器芯片,其支持对HD-TVI、NTSC/PAL制式960H分辨率及普通AHD视频格式的解码。TP2855具有内部钳位,在每个通道上都有自动增益控制放大器,用于最佳的信号调节。即使在使用低质量和长线缆的条件下,它的可编程均衡放大器和自动控制环也能维持尚佳的表现。

hufan92的博客 4921

【剑指offer】约瑟夫环问题

推公式一: 理解原始的约瑟夫环问题,简化为10个人,报数到3枪毙。 那么我们此时用f(n)表示n个人的时候,能够存活的位置索引。由上图显然可以得到f(1)=0,f(2)=1,…,f(10)=3。但是我们要找的是通项公式。从图中也可以很直观的看到,n=9时d的位置索引就是n=10时循环左移了3位。那么可以得到f(10) = (f9 + 3) % 10,因为是循环左移,所以需要加一个取余,防止越界。...

weixin_44718349的博客 648

STM32 USART高级功能全解析:IrDA、DMA、硬件流控与低功耗唤醒

USART是嵌入式系统中最基础的串行通信外设,其核心原理在于同步/异步时序控制与数据帧收发机制。现代MCU如STM32通过深度集成IrDA调制解调、DMA直传通道、RS232/RS485硬件流控及Stop模式唤醒等扩展能力,显著提升通信可靠性、吞吐效率与能效比。其中,IrDA SIR采用RZI编码实现抗干扰红外传输,DMA通过TXE/RXNE事件驱动实现零CPU干预的连续数据流,而硬件流控(RTS/CTS/DE)和低功耗唤醒(WUF+UESM)则分别保障工业现场鲁棒性与电池级超长待机。本文围绕STM32平台

weixin_28922227的博客 211

【算法经典】 约瑟夫环问题

【前言】本文讨论经典算法问题约瑟夫环问题的递归解法。 一、问题描述 作为算法中的经典问题,约瑟夫环问题自诞生以来有各种各样的变种描述,丢手绢、游戏获胜者、圆圈中最后剩下的数字、点名游戏等等,但都是同样的数学模型和解题思路。为了讨论该问题,现在将其统一描述如下: 0 , 1 , … , n-1 这 n 个数字围成一个圆,从数字 0 开始,每次从这个圆里删除第 m 个数字(删除后从下一个数字开始重新计数)。求这个圆圈里剩下的最后一个数字是多少。 样例 输入:int n = 6, int m = 3 输出:i

qq_40692274的博客 3519

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 927

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 620

约瑟夫问题与魔术(二)——数学结构解析

在上一篇文章中(约瑟夫问题与魔术(一)——数学模型求解),我们聊到了约瑟夫问题的定义,以及其用环的数学模型来建模,最后用循环单链表的数据结构解决该问题等内容。这些只是基本内容,当我们有了...

magic2728的博客 561

Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。图1:Informer模型结构[1]如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。图2:参考Transformer画的Informer模型结构。

AI_daily的博客 3492

约瑟夫环问题(数学方法求解)

问题描述: n个人(编号0 ~ n-1),从0开始报数,报到m-1的退出,剩下的人继续从0开始报数。求胜利者的编号。 分析: 第一个出列的人编号是m-1,剩下的n-1个人就又组成了一个新的约瑟夫环(从编号为k = m % n的人开始),有: 出列前的编号 k k+1 k+2 … n-2 n-1 0 1 2 … k-2 出列后的编号 0 1 2 … … n-2 这样就重...

默的博客 1109

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1677

从模糊到清晰:让AI教相机自动对焦的实战指南

AI自动对焦技术:让模糊照片成为过去式 深度学习驱动的自动对焦技术正颠覆传统摄影,使相机能在复杂场景下智能锁定焦点。相比传统对焦方法在弱光、低对比度环境下的失效,AI通过学习"清晰-模糊"规律,实现全场景精准对焦。本文详细解析了该技术的三大优势: 自适应各种光线条件; 毫秒级对焦速度; 突破物理限制的精度。 通过PyTorch搭建的CNN模型,展示了从数据采集到模型训练的全流程实战方案,包括使用拉普拉斯算子评估图像清晰度等关键技术。该技术已成功应用于手机摄影、工业检测、无人机航拍和安防监

LXY_LOVE36的博客 348

约瑟夫问题(丢手绢问题)

问题复述:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-...

weixin_43906560的博客 498

【WRF-Chem 工具】CAMStoWRF详解:CAMS数据下载及处理

【WRF-Chem 工具】CAMStoWRF详解:CAMS数据下载及处理

WW、forever的博客 195

POJ 百练 2746: 约瑟夫问题

时间限制: 1000ms 内存限制: 65536kB 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,

youyang1991的专栏 3517

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

约瑟夫环问题--递归推导

本文为学习《剑指offer》的记录。因其原理在原作者博客上找不到,所以,只能自己编写记录,如有不当之处,欢迎指正。题目描述: n个数,编号为 0 , 1, ……, n-1 排成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数,请问最后一个剩下的数是多少?推导过程 定义一个函数 f(n, m) 为 n 个数中取 m 最后剩下的编号。 第一个被删除的数是 (m-1)%n, 记为 k 。

小键233 3473

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

约瑟夫环数学递推公式及其证明

对于约瑟夫问题,今天看到了一篇好帖子,是用数学方法处理的,感觉还不错的 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂 度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。 为了讨论方便,先把问题稍微改变一下,并不影响原意: 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的

zzyzzy12 5470

3517 And Then There Was One 约瑟夫问题

And Then There Was OneTime Limit: 5000MS Memory Limit: 65536KTotal Submissions: 3136 Accepted: 1562<br />Description<br />Let’s play a stone removing game.<br />Initially, n stones are arranged on a circle and numbered 1, …, n clockwise (Figure 1). You are

kongming_acm的专栏 738

利用递推公式的特征方程求解通项公式

理论背景 一个数列有如下形式的递推公式 则特征方程形式如下 求出两个根, 代入 再利用所给数列前两项代入上式求得A、B,即得所求数列的通项公式。 栗子 《编程之美》中有通过斐波那契数列的递推公式求解通项公式的解答 总结 有递推规律的问题如果能利用递推公式可极大降低算法的时间复杂度。 ...

谣言的博客 3085

约瑟夫环(数学高效率解法,很详细)

 5.5.4 用数学方法解约瑟夫环(1) 原文copy:http://book.51cto.com/art/201403/433941.htm 5.5.4  用数学方法解约瑟夫环(1) 上面编写的解约瑟夫环的程序模拟了整个报数的过程,程序运行时间还可以接受,很快就可以出计算结果。可是,当参与的总人数N及出列值M非常大时,其运算速度就慢下来。例如,当N的值有上百万,M的值

qq_25973267的博客 3万+

【算法】约瑟夫环原理及其公式

问题描述:将n个人围成一个圈,从1开始依次数数,数到k或者k的倍数时,这个人出局,如此循环直到环中只剩一个人的时候这个人获胜 可以把这个圈想想成一条直线,假设一开始有11人,k=3 将这11个人从1到11进行编号 从1开始报数,此时的人数是11 第一个被淘汰出局的是3 注意,这里淘汰到三继续往后数的话,就相当于4是第一个人,再从1开始计数,此时的人数为10 数次循环往复,相当于每减少一个人,数组整体向后移动k位(此处k=3,所以是移动三位),整体移动,说明最后获胜的人也是向后移动..

Elephant_King的博客 8228

基本约瑟夫环问题详解

基本问题描述: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。通常,我们会要求输出最后一位出列的人的序号。那么这里主要研究的是最后一个出列的人的序号要怎么确定。 当

多反思,多回顾,要坚持。 1万+

约瑟夫环问题:一群人围成一个圈,开始报数,第三个死,下一个从1开始,问第几位最后不死

package com.softeem.practice;import java.util.Scanner;/** * 约瑟夫环 * 一群人围成一个圈,开始报数,第三个死,下一个从1开始,问第几位最后不死 * @author Administrator * */public class Practice { public static void live(){ Scanner sc=new Sc...

qq_36486085的博客 2464

关于约瑟夫环的问题 的通解

试编写一个求解Josephus问题的函数。用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健壮性。最后分析所完成算法的时间复杂度。【解答】函数源程序清单如下:void

sms88的专栏 1714

约瑟夫环典型问题

题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1597问题:有 0,1,2 .. n-1共n个人,从1开始报数,报到k则此人从环出退出 , 一共出去m个人,求每次出去人的编号;以第一个样例为例: 现在n=6,k=9序列:0 1 2 3 4 5 第一个人出列后的序列为: 0 1 3

PrConstantin 610

约瑟夫环的普通解法及优化

约瑟夫环问题的普通解法很简单,就是不断遍历循环链表,删除节点,假如有n个人,等到第m个人报数时杀掉这个人,即删除这个节点,直到只剩下一个人。struct Node { Node(int data) :_data(data) ,_pNext(NULL) {} int _data; Node* _pNext; };1,普通解法,时间复杂度为O

fern_girl的博客 792

最简化约瑟夫环问题的递归算法详细解析

这个问题可能每个学算法的同学都会遇见,我没那么聪明,第一次看见时做不出来,只发现一些规律,后面看到算法也挺久才看懂,这里是将别人的算法结果做一个解析,例子是暂时网上找的递归最简洁的例子: 下面就以这个例子做一个解析,这个解法的实际问题就是n个东西围成一个圈,从一开始叫到m号的东西出去,求最后剩下的编号。(算法面试极为常见,就想知道你递归学的怎么样,就少用模拟法什么的了) 我们肯定一眼是无法进行

双花诞 9109

约瑟夫环问题的两种解法(详解)

题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃...

啊啦啦的博客 4万+
上一篇: 加法分解方案
下一篇: 合并有序链表
juiceda
博客等级 码龄18年 10粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值