题意:约瑟夫环,求最后三个数. 析:f[i] = (f[i-1] + k) % i 这是求最后一个数时候,我们倒着推到第一个数时,只有一个数,所以当只有两个数时,就是另一数, 同理,我们可以求得第三个数. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #includ…
最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推,n个人中最终存活下来的序号与n-1个人中存活的人的序号有一个递推关系式. 分析: 假设除去第k个人. 0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 //original sequence (1) 0, 1, 2, 3, ..., k-2,      , k, ...,…
题目链接 先说一下什么是约瑟夫环,转自:传送门 关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的.我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程.因此如果要追求效率,就要打破常规,实施一点数学策略. 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(…
什么是约瑟夫环呢? 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列. 我们用程序说话,实现约瑟夫环:eclipse jdk1.6 package code; import java.awt.PointerInfo; import java.util.Random; import java.util.Scanner…
约瑟夫环: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 例如:n = 9, k = 1, m = 5 [解答]出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8. int main()//约瑟夫环 { , m=,k=;//n是人数(编号1,2,……,x),m是出列号,k是起始人编号 , l=; ]; ;i<=;i++) {…
什么是约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为1的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解. 创建一个全局临时表: create global temporary table temp(t_id int) on commit delete rows; 游标…
本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新开始报数,数到第 m 个人,再让他出局......,如此反复直到所有人全部出局为止. 上一篇我们通过数组.静态链表实现了约瑟夫环,具体参考: 通过例子进阶学习C++(六)你真的能写出约瑟夫环么 本文,我们进一步深入分析约瑟夫环问题,并通过c++模板库实现该问题求解,最后我们说明…
今天偶遇一道算法题 "约瑟夫环"是一个数学的应用问题:一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去-,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n, 输出最后那个大王的编号. 方法一:递归算法   1 function killMonkey($monkeys , $m , $current = 0){ 2 $number = count($m…
原来并不知道约瑟夫环还可以递推直接解orz 约瑟夫问题的递推公式: 设f[n]表示一共n个人,数到k出局,这样最后的winner (n个人从0开始标号,即0--n-1) f[n]=(f[n-1]+k)%n (注意%n里这个n也是变量 初值f[1]=0 [公式的详细证明可以refer这里:http://blog.csdn.net/a725sasa/article/details/11664375 ] 不过本题n很大,O(n)仍然会爆 注意到公式中的%n:如果f[n-1]+k小于n,那么就不用再mo…
思路传送门 :http://blog.csdn.net/kk303/article/details/9629329 n里面挑选m个 可以递推从n-1里面挑m个 然后n-1里面的x 可以转换成 n里面的x 的公式 x = (x+m)%n; #include <bits/stdc++.h> using namespace std; int main () { int n,m; scanf("%d %d",&n ,&m); ; ;i <= n;i++) x…
题目链接:戳我 貌似是高一昨天的考试题T2?????感觉挺好玩的就搞了搞qwqwq 其实是HDU上面的题啦.... 对于普通的约瑟夫问题,大概是n个人围成一个环,从1开始报数,数到k,那个人出队,最后留下来一个人的时候他就是胜利者,问最后胜利者是谁. 这个一般我们都用递归或者递推搞,设\(f[n]\)表示n个人的时候最后的胜利者的编号.(如果从0开始编的话),显然有\(f[1]=0\).递推式子为\(f[i]=(f[i-1]+k)\mod i\) 但是显然O(n)的递推对于这道题来说时间复杂度还…
题目链接: https://cn.vjudge.net/problem/POJ-2886 题目大意: N个人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出来的人(如果他手上拿的数为正数,从他左边数A个,反之,从他右边数A个) 跳出来的人所得到的糖果数量和他跳出的顺序有关 所得的糖果数为 (假设他是第k个跳出的) 则他得到的糖数为k能被多少个数整除 解题思路: 首先将因子个数打表:因子个数打表模板 然后先求出1-n中因子个数最大的为x,约瑟夫环进行x次 用线段树求出每次约瑟夫环后的具体下标.因…
n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数. (报数是从1报起)当报到 k 的时候,这个人就退出游戏圈.下一个人重新从1开始报数. 求最后剩下的人的编号.这就是著名的约瑟夫环问题. 本题目就是已知 n,k 的情况下,求最后剩下的人的编号. 题目的输入是一行,2个空格分开的整数n, k 要求输出一个整数,表示最后剩下的人的编号. 约定:0 < n,k < 1百万 例如输入: 10 3 程序应该输出: 4 每杀掉一个人,其实就是把这个数组向前移动了M…
分析: 如果问题是要求最后一个删除的数,重新编号为0到n-1,f[n]表示答案,那么f[n] = (f[n-1]+k)%n. 因为删掉下标k-1以后可以从下标k重新编号为0. 在这个问题只需要推出最后三个数,然后三个数一起转移即可. 单个case的复杂度O(n) #include<bits/stdc++.h> using namespace std; ; ]; //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt"…
一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列:如此下去,直到圆桌周围的人全部出列为止. 一般情况下,循环链表就可以解决这个问题,但是我正在学习递归,所以就递归实现了,下面附上代码: #inclu…
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列. import java.util.Scanner; public class Test { /** * @param args */ public static void main(String[] args) { Scanner scanner = new Sc…
http://poj.org/problem?id=1012 答案以954ms飘过,不过这道题可以轻松用打表过 思路:如果我们把每个人位于数组中的原始编号记为绝对编号,每次循环过后相对于绝对编号为0的人的编号为相对编号,那么在这道题里,绝对编号是不重要的,只需要每次相对编号n都落在n>=k的位置上,那么n轮后自然所有的bad boy都被处理了. 而相对编号的推导: 设 id[i]为第i轮点到的编号(i从1开始计数),第i+1轮开始时存在的人数就会是2*k-i,点到的人的编号就是(id[i]+m-…
/************************************************************************* > File Name: 45_LastNumberInCircle.cpp > Author: Juntaran > Mail: JuntaranMail@gmail.com > Created Time: 2016年09月04日 星期日 20时21分57秒 *************************************…
<?php function popChar($str , $m , $current = 0){ $number = count($str); $num = 1; if(count($str) == 1){ echo $str[0]; return; } else{ while($num++ < $m){ $current++ ; $current = $current%$number; } echo $str[$current]."<br/>"; array…
最近忙着做面试题,看到一道题感觉比较有兴趣,查阅相关资料后发现这是一个约瑟夫环的问题. 一群猴子围成一圈,按1,2,3,4,....n一次编号.然后从第1值开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再踢它出去...,如此不停进行下去,知道最后剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n输出最后那个大王编号? 下面内容来自网页: 解决问题的核心步骤:(程序的基本算法) ⒈建立一个具有n个链结点,无头结点的循环链表: ⒉确定第1个报数人的位置: ⒊不断地…
/*约瑟夫环 (问题描述) 约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任意选 一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新 的m值,从他在顺时针方向下一个人开始从1报数,如此下去,直至所有人全部出列为止.试设计一个程序求出出列顺序. (基本要求) 利用单向循环链表存储结构模拟此过程,按照出列顺序印出个人的编号. (测试数据) m的初值为20:…
Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这个人就要踢出比赛,然后从被踢出的人的下一个人开始,重新报数(从1开始).这样经过n-1次后,就只剩下了一个人,问最后剩下的那个人是几号? Input 第1行为T,表示有T组数据: 第2行到第T+1开始,每行输入n和m,n表示有几个人,m为上述的每报数m次就要踢出一个人 1=<n<=100, 1=<m<=1…
题目大意:给定 \(N\) 个人围成一个圈,每隔 \(M\) 个人杀一个,求最后活着的人的编号. 题解:环会涉及模运算,所以先将 \(1 \rightarrow N\) 映射为 \(0 \rightarrow N-1\),且报数从 \(0\) 开始,即:报数到 \(m-1\) 的人会被杀掉.假设已知 \(N-1\) 人时剩下的人的编号为 \(x\),如何求得 \(N\) 个人时活着的人的编号是问题的关键.现在逆向考虑问题,即:游戏第一次杀人后的子问题和原问题之间的关系.假设第一次报数时,编号为…
链接:https://www.nowcoder.com/acm/contest/121/D来源:牛客网 题目描述 ZQ是一个拥有n女朋友的万人迷,她的每一个女朋友每天晚上都会挨个给他打电话,要他讲了睡前故事才能睡觉.可是,每次他的女朋友都会挑他在吃鸡的时候打电话,ZQ总是因为挂机被舍友赶出宿舍,于是,ZQ告诉他的女朋友们,别打电话了,他会主动打过去给他们讲故事,再打电话就分手! 于是,ZQ把他的女朋友名字写在纸上,画成一圈,顺时针编号为1~n,然后从1开始顺时针数.在每一次数数中,ZQ数k个就停…
题目描述: N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推.    请按退出顺序输出每个退出人的原序号. 输入: 包括一个整数N(1<=N<=3000)及一个整数p. 输出: 测试数据可能有多组,对于每一组数据, 按退出顺序输出每个退出人的原序号. 样例输入: 7 3 样例输出: 3 6 2 7 5 1 4 模拟一下即可,利用next数组模拟环形,节省时间 #include <cstdio&…
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号.例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号.Input2个数N和K,表示N个人,数到K出列.(2 <= N, K <= 10^6)Output最后剩下的人的编号Input示例3 2Output示例3解: #include <stdio.h> int main() { int n, k; while (scanf_s("%d…
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. Input: 2个数N和K,表示N个人,数到K出列.\((2 <= N <= 10^{18}, 2 <= K <= 1000)\) Output: 最后剩下的人的编号 my solution:暴力打表得出规律:\(f[n]=(f[n-1]+k)%n\)注意这个式子,因为k远远小于n所以…
传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第三个人时将第三个人杀死,然后再数,直到杀光所有人.约瑟夫和另外一个人决定不参加这个疯狂的游戏,他们快速地计算出了两个位置,站在那里得以幸存.写一段程序将n个人围成一圈,并且第m个人会被杀掉,计算一圈人中哪两个人最后会存活.使用循环链表解决该问题.这个问题就是典型的循环链表的应用,实现了循环链表后还有个问题就是…
list.h #ifndef _List_H #define _List_H typedef int ElementType; struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; //定义一个空链表 List MakeEmpty(); //判断链表是否为空,0为空,1为非空 int IsEmpty( List L ); //int IsLast( Posi…
Gym - 101955KLet the Flames Begin  说实话,没怎么搞懂,直接挂两博客. 小飞_Xiaofei的约瑟夫问题(Josephus Problem)3:谁最后一个出列 小飞_Xiaofei的约瑟夫问题(Josephus Problem)4:第k个出列的人是谁  林夕-梦的约瑟夫环问题 ( 最简单的数学解法) 等真正搞明白再来理一理思路,现在直接将讲一下流程. 约瑟夫环题目就是n个人轮流报数,报到k的出列,然后接着重新从1开始报,再报到k的出列. 求最后一个出列的人便是,…