【51nod - 1073】约瑟夫环问题模板
题干:
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3
解题报告:
思路: 直接模拟的话O(n*k)的时间复杂度,按照套路来的话这样的题一般是能找规律的; 我们先将n个人的编号改成0~n-1(别问为什么,套路而已),那么第1次报到号码为k-1的人出列,圈里还剩下n-1个人 我们对比一下出列前后的编号:出列前: 0, 1, 2, 3, 4, 5, 6, ...k-2, k-1, k... n-1 出列后: n-k+1,..................n-2, , 1... n-k我们可以发现留下的人编号和留下来之前是一一对应的,那么要是能找到对应关系的话问题就迎刃而解了,不过现在数据太多了不好找 (偶就是这里找错了规律然后只过了样例),我们接着往下想想... 按照前面的规律,第n次报数时只有一个人,我们给他重新编号为0.前面我们也知道了某一轮某个人的编号和上一轮是对应的,最后留下的人此时的编号为0, 那么只要我们由它上溯并找到它在第一轮时的编号答案就出来了啦~ 我们用f(x)表示最后留下来那个人在第n-x+1轮中的编号(这样做我们就是由f(1)推f(n),更直观一些,反之由f(n)推f(1)也是可以的),那么f(n)+1就是 最终答案了啦.很显然有f(1)=0(因为此时只剩下一个人了嘛),接下来我们需要找到两轮编号之间的映射关系,这个可以有枚举k和x得到,这里就不写枚举 过程了啦~ 最后我们可以得到公式 f(x)=(f(x-1)+k)%x;
AC代码:
#include <bits/stdc++.h>
using namespace std;int main(void){int gg, n, k;cin >> n >> k;gg=0;for(int i=2; i<=n; i++){gg=(gg+k)%i; //前面说的f(x)只是为了我们更直观地理解,其实直接用一个变量保存上一轮序号就可以了}cout << gg+1 << endl;return 0;
}
转自https://www.cnblogs.com/geloutingyu/p/6202200.html
【51nod - 1073】约瑟夫环问题模板相关推荐
- 约瑟夫环(51nod)
先理解下什么是约瑟夫问题:https://blog.csdn.net/tingyun_say/article/details/52343897 以及解决方法:https://blog.csdn.net ...
- K - Let the Flames Begin Gym - 101955K(约瑟夫环/2018icpc沈阳)
VJ地址 思路:因为m和k的最小值一定小于2E6,那么我们可以分情况来求,如果m比较小直接o(m) 递推求出第m个死的人,如果k比较小,我们在每一轮+k的时候取模的操作都是无效的,我们可以用乘法累积起 ...
- POJ 3517 And Then There Was One( 约瑟夫环模板 )
链接:传送门 题意:典型约瑟夫环问题 约瑟夫环模板题:n个人( 编号 1-n )在一个圆上,先去掉第m个人,然后从m+1开始报1,报到k的人退出,剩下的人继续从1开始报数,求最后剩的人编号 /**** ...
- 代码验证约瑟夫环百科词条中的故事(Python)——约瑟夫斯的故事、数学家加帕斯讲的故事,体验算法模板的奇妙。
[点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...
- 51nod 1073 约瑟夫环
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...
- C++约瑟夫环改良版
约瑟夫环:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的 ...
- HDU 5643 King's Game 【约瑟夫环】
题意: 变形的约瑟夫环,最初为每个人编号1到n,第i次删去报号为i的人,然后从它的下一个人开始重新从1开始报号,问最终剩下第几号人? 分析: 首先看一下裸的约瑟夫环问题: 共n个人,从1开始报数,报到 ...
- 约瑟夫环问题的几种解法
int mind01() {vector<int> vec;int n, m;scanf("%d%d",&n,&m);//初始化for (int i=1 ...
- python中约瑟夫环程序_Python实现约瑟夫环问题的方法
本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的 ...
最新文章
- 设计模式之工厂模式(Factory)(3)
- CCF-百度松果基金闭门研讨会成功举办,百度飞桨提供基金平台支持
- Java基础之线程池
- 微软银光 Sliverlight
- 创业12年 最野蛮的屌丝创业者
- GD32F303修改外部25M晶振
- unity视频教程【高清+精选】大放送
- WORD VBA实现查找带格式的文字并复制到特定地方
- a股用计算机模拟走势,告诉你A股今后几天惊现千股涨停
- 工业镜头景深计算及工业镜头技术分析
- 淫欲的真相是什么呢?可能很多英雄豪杰都没有想到过
- Apollo安装记录
- 【看表情包学Linux】缓冲区的概念 | Git 三板斧 | 实现简易进度条
- Spirng的事务 方法A调用方法B,事务是否失效
- DBeaver 工具的使用
- 来自Percal25号行星的哥顿人
- 眨个眼就学会了 Pixi.js
- 应用 AddressSanitizer 发现程序内存错误
- 【咸鱼】有关origin下载速度过慢解决措施
- 【UE4】C++的RPC调用
热门文章
- Java学习笔记3——集合框架
- shell变量里的字符替换
- centos 源码安装mysql5.6_CentOS 7下源码安装MySQL 5.6
- git连接jenkins_开普勒云平台:如何配置gitlab与Jenkins
- java jlabel里面加button_在Java Swing中通过JLabel覆盖JButton?
- 987C. Three displays
- db2 某个字段排序_MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序...
- GenerateProjectFiles.bat分析
- php怎么调试小程序,教你如何配置微信小程序
- java vo转map_JAVA Map转换为Bean或VO