题目简述:一个地区需要进行能源限制,因此需要对所有的街道 N 进行轮流停电,为了公平起见,每隔 m-1 个街道就进行停电。例如,N=17,m=5时,得到的停电顺序为:1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7。 问每次都从1开始,到13街区截止的情况下,m 最小是多少。
这个问题是约瑟夫问题的改版。约瑟夫问题可以简单的理解为就是一群人站成一圈,每个报数为 m 的人离开这个圈子,问最后剩下的那个人是编号几。
约瑟夫问题有两种解法,第一种为链表法,但是缺点是时间复杂度达到了 O(nm),另一种是用 dp 的想法,有一个递归公式 f(n) = [f(n-1)+m]%n。这个公式可以这样理解,我们首先要先明确,在给定 n 和 m 的情况下,不管进行了几轮的报数,最终活下来的都是同一个人。那么以此为基础。假设 甲1,甲2,甲3,甲4,甲5,这五个人,每次叫到2的人就离开,那么第一个离开的就是甲2,下一轮报数的时候就会变成是甲3,甲4,甲5,甲1。第二轮报数的时候,可以想象成后面的人往前移动了m个位置。这就说明了一个问题,每经过一轮,最终活下里的那个人,他的编号就会往前 m 个。
UVA 151 Power Crisis题目简述:一个地区需要进行能源限制,因此需要对所有的街道 N 进行轮流停电,为了公平起见,每隔 m-1 个街道就进行停电。例如,N=17,m=5时,得到的停电顺序为:1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7。 问每次都从1开始,到13街区截止的情况下,m 最小是多少。这个问题是约瑟夫问题的改版。约瑟夫问题可以简单...