zoukankan      html  css  js  c++  java
  • 约瑟夫环问题

    问题描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依规律重复下去,直到圆桌周围的人全部出列,求最后出列的人的原始编号。

    朴素算法:链表模拟,时间复杂度O(NM),代码比较简单就不贴了。

    效率算法:设初始编号为0~n-1,叫到m的人出列,然后每次出列后,下一位同学开始从0编号。这样做能保证剩下得最后一个人的编号就是0.但显然输出0是错的哇,所以我们观察一下在重置0的过程中,编号发生了什么变化。
    当有k个人的时候,我们让第m-1个人出列,这样剩k-1个人的时候,m号就变成了0号。
    所以想反回上一状态只要把编号+m就可以了。
    这样我们便可以从只剩一个人的状态向前推,一直推到n个人。
    但是还有个小问题就是+m后可能会超过k的范围,因为是一个圈,所以做个取余运算就可以了。

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n,m;
        while(cin>>n>>m,n||m)
        {
            int ans=0;
            for(int i=2;i<=n;i++)
                ans=(ans+m)%i;
            cout<<n<<' '<<m<<' '<<ans+1<<endl;
        }
        return 0;
    }
  • 相关阅读:
    【转】SMARTY 不乱码截取中文
    godaddy最新优惠码
    javascript 学习之屏幕尺寸获取。
    IE6 实现minwidth
    css 修改页面选中时背景颜色
    jQuery 闪动的文字提示
    jQuery插件 blockUI
    HTML 5 video 视频标签全属性详解
    linux打包压缩命令汇总
    Windows 下MySQL zip 安装
  • 原文地址:https://www.cnblogs.com/LukeStepByStep/p/5918482.html
Copyright © 2011-2022 走看看