NOJ 1033 约瑟夫问题

本文介绍了约瑟夫问题,即在编号的学生中按一定规则淘汰,最后求剩余学生编号的问题。给出了解题思路,通过递归解决子问题,以及代码实现,强调了数学在解决问题中的重要性。
摘要由CSDN通过智能技术生成

2016.10.14

【题目描述】
1033.约瑟夫问题(Joseph)

时限:100ms 内存限制:10000K 总时限:1000ms

描述
设有N名同学手拉手围成一圈,自1、2、3、……开始编号,现从1号开始连续数数,每数到M将此同学从圈中拉走, 求最后被拉走的同学的编号

输入
两个正整数M和N
输出
一个正整数,为最后被拉走的同学的编号,最后输出回车

输入样例
5 3
输出样例
4

【解题思路】
这就是传说中的约瑟夫环问题。
从1开始报数,报到m的人会出列,这时第m+1个人编号为1,剩下的n-1个人又组成了一个新的约瑟夫环。如果我们知道了子问题的解,那么就能知道原问题的解。易知剩下最后一个人的编号为1,可以向前推出原问题的解。
考虑原数列: 1,2,…,n
第m-1个人出列:1,2,…,k-1,k+1,…,n (k = m % n)
改变顺序: k+1,k+2,…,n-1
重新编号: 1,2,…., n-1
这样设子问题的解为x’, 易知x’ = x + k = x + m % n = (x + m) % n;

【代码实现】

#include <iostream>

usin
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值