1073 约瑟夫环
Posted watchfree
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1073 约瑟夫环相关的知识,希望对你有一定的参考价值。
1073 约瑟夫环
基准时间限制:1 秒 空间限制:131072 KB
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
import java.util.Scanner; public class Main { static int fun(int m,int k,int i){ if(i==1) return (m+k-1)%m; else return (fun(m-1,k,i-1)+k)%m; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int m=sc.nextInt(); int k=sc.nextInt(); System.out.println(fun(m,k,m)+1); } sc.close(); } }
设f(m,k,i)为m个人的环,报数为k,第i个人出环的编号,则f(10,3,10)是我们要的结果
当i=1时, f(m,k,i) = (m+k-1)%m
当i!=1时, f(m,k,i)= ( f(m-1,k,i-1)+k )%m
---------------------------------------------------------------------------------------------------------------------
解法2
----------------------------------------
package 约瑟夫环的数学优化方法; import java.util.Scanner; /* 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。 */ public class Main { public static void main(String[] args) { // TODO Auto-generated method stub int n,m,i,s=0; Scanner sc=new Scanner(System.in); n=sc.nextInt(); m=sc.nextInt(); for(i=2;i<=n;i++){ s=(s+m)%i; } System.out.println(s+1); } }
以上是关于1073 约瑟夫环的主要内容,如果未能解决你的问题,请参考以下文章