zoukankan      html  css  js  c++  java
  • Poj 3517 And Then There Was One Joseph核心问题

    基本上纯Joseph核心问题,只是第一步多一件。m。

    然后你就可以用获得的递推公式:

    Win(n) 代表n当个人的中奖号码,

    然后,Win(n)必须相等Win(n-1)。当一个人将在下一次删除队列。

    下一个出队列的人是谁呢? 假设模是mod的话,那么下一个出队号码计算为:

    Lose(n) = mod % n;

    if (Lose(n) == 0) Lose(n) = n;

    这样得到公式:

    Win(n) - Lose(n)  = Win(n-1);

    Win(n) = Win(n-1) + Lose(n);

    可是注意人数仅仅有n个了,所以要取模:

    Win(n) = (Win(n-1) + Lose(n)) % n;

    if (Win(n) == 0) Win(n) = n;

    然后由于最后要剩下一个人。那么最后一个人为Win(1) = 1;


    可是假设写一般的递归公式。那么就会导致栈溢出的,所以要逆过来,从仅仅有1个人的时候推起,推到第n


    这样够清晰了吧,这你都不明确我就没办法了。

    作者:靖心 http://blog.csdn.net/kenden23/article/details/30050425

    最后得到AC代码:

    #include <cstdio>
    int main()
    {
    	int n, k, m;
    	while (scanf("%d %d %d", &n, &k, &m) && m)
    	{
    		int winN_1 = 1, winN = 0;
    		for (int i = 2; i < n; i++)
    		{
    			int t = k % i;
    			if (t == 0) t = k;
    
    			winN = (winN_1 + t) % i;
    			if (winN == 0) winN = i;
    
    			winN_1 = winN;
    		}
    		int t = m % n;
    		if (t == 0) t = m;
    
    		winN = (winN_1 + t) % n;
    		if (winN == 0) winN = n;
    
    		printf("%d
    ", winN);
    	}
    	return 0;
    }


    当然我们能够简化上面程序。思路是一样的,只是依据模的特性简化一下罢了:

    网上通常是以下这种程序,只是他们的推导。我个人认为较难懂,所以有上面我自己的推导和程序。

    我的推导是把这种模简化隔离出来,我个人认为会清晰非常多。

    所以假设你看了网上类似的以下程序,认为糊里糊涂的话。建议能够參考我上面的程序。

    #include <cstdio>
    int main()
    {
    	int n,k,m;
    	while(scanf("%d%d%d",&n,&k,&m) && n)
    	{
    		int winN = 0, winN_1 = 0;
    		for(int i = 2; i < n; i++)
    		{
    			winN = (winN_1 + k) % i;
    			winN_1 = winN;
    		}
    		winN = (winN_1 + m)%n;
    		printf("%d
    ", winN+1);
    	}
    	return 0;
    }



    版权声明:笔者靖心脏。景空间地址:http://blog.csdn.net/kenden23/,只有经过作者同意转载。

  • 相关阅读:
    shell_02
    shell_practise
    Shell_01
    PythonDay_03
    PythonDay_02
    PythonDay_01
    面试题32:从上到下打印二叉树
    面试题 31 : 栈的压入、弹出序列
    面试题20 : 表示数值的字符串
    面试题29:顺时针打印矩阵
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4756850.html
Copyright © 2011-2022 走看看