约瑟夫环

    xiaoxiao2021-03-25  121

    refer:

    点击打开

    题目:N个人(编号0,...,N-1)围坐一圈,给定幸运数字M,从0开始依次报数,报到M-1的人出局,下一个人继续从0开始报数,循环,求最后一名成员。

    (注:为了与习惯的编程表达一致,这里统一从0开始编码)

    思路:

    直接循环判断,时间代价太大。

    数学推导:

    ①第一次,N个人参与,则第M%N-1个人出局,剩下N-1个人;(这里,我们标识结果为f(n))

    ②从上次出局的下一个人开始,即原始编码为M%N的人,他报号为0,则下一个淘汰的人应该是原始编码为:(M%N)+(M%(N-1)-1)的人;

    得出,f(n) = (f(n-1) + M)%N

    代码:

    #include<iostream> using namespace std; int main() { int N; int M; cin>>N; cin>>M; int result=0; //f(1); for (int i=2; i<=N; i++) { result=(result+M)%i; } cout<<"lucky one is "<<result+1<<endl; return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-11132.html

    最新回复(0)