約瑟夫環問題

題目描述:

   給n我的圍城一個環,從m號開始殺,每次隔k-1我的(從上一次被殺的人下一個開始數k下,第k我的被殺),問最後剩下的人是幾號。ios

   bc的75場有一個邊形,uvalive3882 也是個變形;spa

思路:code

   咱們能夠遞推解決,設 f[n] 表示的是第 n 個被殺的人是誰。blog

   首先咱們將人從0開始編號,而後就是0~n-1 。string

   f[ 1 ] =0;it

   第一次咱們殺的是k-1號,而後咱們從新編號,從原來的第k個開始編0號,io

   而後若是咱們知道剩餘的n-1 的人剩餘的是誰,那麼原來這我的的編號就是加上k後的值;class

   而後再反推一下。stream

   那麼,咱們知道,到最後,剩一我的的時候,他的編號確定是0,並且必須死,因此有上面的f[1] = 0;im

   那麼他在上一次的編號是多少呢?

   若是k =3, 那麼他的編號應該是 (0+3)%2 =1;

   咱們來驗證一下, 0 、一、 0 ,0死了,1剩下了。對的。

   因此。。。。就很簡單了,遞推一下就結束了,記得回頭加上1;

   

/*************************************************************************
 > File Name: uvalive3882.cpp
 > Author: Baiyan
 > 題意:
 > Created Time: 2016年05月28日 星期六 17時08分47秒
 **********************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[10005];
int main()
{
    int n,m,k;
    while(scanf("%d%d%d", &n,&k,&m)!=EOF &&( n||k||m))
    {
        memset(f,0,sizeof(f));
        f[1]= 0;
        for(int i=2;i<=n;i++)
        {
            if(i<n)
                f[i] = (f[i-1]+k)%i;
            else
                f[i] = (f[i-1]+m)%i;
                        //這裏就是當前殺第幾我的就加幾
        }
        printf("%d\n",f[n]+1);
    }
    return 0;
}
    
相關文章
相關標籤/搜索