美文网首页
约瑟夫环详解

约瑟夫环详解

作者: rensgf | 来源:发表于2021-03-30 21:43 被阅读0次

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。

那么第一个死的是(m-1)%n号,现在只剩下来n-1人,从m%n开始报数。
设f(n)表示共有n个人时最终存活的人,共10人,编号0-9,每次杀3号:
f(1)=0;只剩1个人,它的位置是pos=0;
f(2)=(0+3)%2=1;这个人在上一轮也存活,它的位置是:pos=(0+m)%2;
f(3)=(1+3)%3=1这个人在上上一轮也存活,它的位置是:pos=((0+m)%2+m)%3;


我们可以看出,最后一个杀死的人,在前一轮的排序正好与 这一轮的排序相差m,因为倒数第二轮从他开始,数了m个数后正好到他。f[1]=(f[0]+3)%2=1;
以此类推,他在倒数第三轮的排序正好与倒数第二轮相差m。
得到递推公式: f[i]=(f[i-1]+m)%i
因此,可以得到:

    int lastRemaining(int n, int m) {
        int f[n+1];
        f[1]=0;
        for(int i=2;i<=n;i++)
        {
            f[i]=(f[i-1]+m)%i;
        }
        return f[n];
    }

进一步简化:

    int lastRemaining(int n, int m) {
        int res=0;
        for(int i=2;i<=n;i++)
        {
           res=(res+m)%i;
        }
        return res;
    }

相关文章

  • 约瑟夫环详解

    第n个出列 ? ---> 0(**) 从上面可以总结规律: 1. f(*) = (f(**)+m)%n n指当前未...

  • 约瑟夫环详解

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。 那么...

  • 约瑟夫环详解

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。 那么...

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 循环单链表实现约瑟夫环(C语言)

    约瑟夫环

  • 约瑟夫环

    题目:100名学生围成一个圈, 编号从1到100,从第一名学生开始报数,从1-9报数 每报出9就退出,直到所有学生...

  • 约瑟夫环

  • 约瑟夫环

    问题:1~n个人围成一圈,从1开始报数,每次数到m这个人就出列,问最后剩下的是几号? 做法:递归。 假设剩下的是f...

  • 约瑟夫环

    解法一 用一个list模拟删除过程 解法二 数学公式,推到过程还没看懂

  • 约瑟夫环

    之前去面试的时候遇到这个问题,作为一只算法渣渣,自然带着恐惧的心情,然后自己瞎捣鼓了好长时间终于拼凑出来了一个很菜...

网友评论

      本文标题:约瑟夫环详解

      本文链接:https://www.haomeiwen.com/subject/achnhltx.html