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

        室友的实验报告就是这个题,感觉不亚于CF div2 的 D 题难度。。  虽然它没有时间和空间限定

        首先是约瑟夫环的解法优化  : http://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98

        这也是算导190页的一个练习!

        主要是利用动态规划来降低复杂度

        具体思路如下

        1.把  N 个约瑟夫环 中第一个数到 M步的人(假设编号为 K )剔除掉

        2.那么接下来的问题就是:从  (N-1)个人中找第一个数到M步的人  

        我们把N-1人重新编号(从K+1开始编号),又组成了一个新的N-1 约瑟夫环问题

        那么  假设  在这  N-1 个人中幸存者的编号为  T(序列已改变) 那么它在原序列中的位置应该是(T+M)%N ————这个公式非常重要;

        然后我们就可以根据这个递推, 当 约瑟夫环中只有一个元素的时候,答案为  1 , 所以逆推,就可以求出约瑟夫环为N的时候  幸存者所在的编号 算法复杂度为 O(n)

      

        敢死队问题:

        给定 N ,M ,问你从编号几开始数 编号1 永远是最后一位!  利用循环链表的性质,如果从编号  1 开始数  最后一个出来的编号是  T,那么从 编号2  开始数就是T+1,知道了相对位置,求解此题也就容易了 算法复杂度 为 O(N);

       

    没有梦想,何谈远方
  • 相关阅读:
    v-for基本使用
    SSH
    Git 命令
    bower笔记
    gulp使用例子
    yeoman使用例子
    grunt搭建
    不会误解的名字
    Python 多线程 多进程
    Python 协程
  • 原文地址:https://www.cnblogs.com/zyue/p/3147455.html
Copyright © 2011-2022 走看看