Joseph环问题
2016-06-06 12:26
302 查看
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知N个人(以编号1,2,3…N分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入描述:输入三个数 N, k , m;
1<= k <= N; 1<= m <= N;
*问题描述*
有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当n=5, k=2时:
1号小朋友报数1;
2号小朋友报数2淘汰;
3号小朋友报数3;
4号小朋友报数4淘汰;
5号小朋友报数5;
1号小朋友报数6淘汰;
3号小朋友报数7;
5号小朋友报数8淘汰;
3号小朋友获胜。
给定n和k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数n和k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
我的答案如下:
输入描述:输入三个数 N, k , m;
1<= k <= N; 1<= m <= N;
import java.util.Scanner; import java.util.List; import java.util.ArrayList; public class JosephCircle { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (input.hasNextInt()) { int N = input.nextInt(); int k = input.nextInt(); int m = input.nextInt(); List<Integer> list = new ArrayList<>(); for(int i = 1; i <= N; i++) { list.add(i);//将编号1,2...N存到链表 } System.out.println(printLast(list, k, m)); } input.close(); } private static int printLast(List<Integer> list, int k, int m) { int count = 0; /*从编号k开始报数,所以从k开始遍历一遍链表*/ for (int i = k - 1; i < list.size(); i++) {//第k个人下标为k-1 if (count == m) { list.remove(i); i--;//因为删除一个元素,后面元素向前移动一位 count = 0; } else { count++; } } /*从第一个人开始,反复遍历链表*/ while (list.size() > 1) { for (int i = 0; i < list.size(); i++) { if (count == m) { list.remove(i); i--;//因为删除一个元素,后面元素向前移动一位 count = 0; } else { count++; } } } return list.get(0); }
【2018/3/10】
昨天参加CCF的CSP认证模拟考试时遇到Joseph环问题(试题编号201712-2),想了好久才Accepted,回实验室翻看了两年前写的这篇文章并稍作修改,才发现写博客是很有用的,博客是学习的积累,希望能长期坚持写下去。*问题描述*
有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当n=5, k=2时:
1号小朋友报数1;
2号小朋友报数2淘汰;
3号小朋友报数3;
4号小朋友报数4淘汰;
5号小朋友报数5;
1号小朋友报数6淘汰;
3号小朋友报数7;
5号小朋友报数8淘汰;
3号小朋友获胜。
给定n和k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数n和k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
我的答案如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int k = input.nextInt(); int[] array = new int ; for(int i = 0; i < n; i++) { array[i] = i + 1; //存编号1,2...n } int remain = n; //剩余人数 int count = 1; //计数 while(remain > 1) { for(int i = 0; i < n; i++) { if (array[i] == 0) { continue; } if (count % k == 0 || count % 10 == k) { //淘汰条件 array[i] = 0; //编号置0 remain--; } if (remain == 1) { break; } count++; //计数+1 } } for(int i = 0; i < n; i++) { if (array[i] != 0) { System.out.print(array[i]); } } input.close(); } }
相关文章推荐
- 多线程常用方法总结
- [LeetCode]problem 174. Dungeon Game
- rowid切片,模拟oracle并行
- Android常用adb命令指南
- PHP中的错误处理
- 查看数据库所有参数脚本
- TabHost详解
- 用GDB调试C程序命令集锦
- 程序填空
- lassen项目启动
- hive函数总结
- 编程教程资源整理汇总
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- Linux内核学习和研究及嵌入式(ARM)学习和研究的开放文档
- MySQL影响性能的因素
- ByRef和ByVal
- 获取执行计划对象信息
- 从buffer快速保存pgm图片,不借助第三方库
- 北航面试之操作系统面试每章的重点Get(完整版)