約瑟夫環(huán)詳解

約瑟夫問題是個有名的問題:N個人圍成一圈,從第一個開始報數(shù),第M個將被殺掉,最后剩下一個,其余人都將被殺掉。

那么第一個死的是(m-1)%n號,現(xiàn)在只剩下來n-1人,從m%n開始報數(shù)。
設(shè)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,因為倒數(shù)第二輪從他開始,數(shù)了m個數(shù)后正好到他。f[1]=(f[0]+3)%2=1;
以此類推,他在倒數(shù)第三輪的排序正好與倒數(shù)第二輪相差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;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容