【HDU 2211】【水题】杀人游戏

以前做过的,直接水,类似学校PTA上的猴子选大王哈哈哈哈  解释如下。

/*
每次杀人之后,土匪的编号都是会改变的。

这个算法的思想就是使用「函数的递归调用」来模拟最后一个被杀的人在每次杀人结束后的位置,而不是像 算法一 一样的详细模拟每个人的状态。

虽然最后被取出来的人在每一次中的位置不一样,但是前一次与后一次之间存在关系。

题目所给例子「最后被杀的是 10」

1 2 3 4 5 6 7 8 9 10 <----位置----> 10
1 2 4 5 7 8 10 <----位置----> 7
1 2 5 7 10 <----位置----> 5
1 2 7 10 <----位置----> 4
1 2 10 <----位置----> 3
通过函数的递归调用由后一次得到前一次的位置,即只需要加上前一次 10 左边被杀掉的人数就行。

假设 a 为前一次 1 到 最后一个被杀的人之间活着的人数,m 为 后一次的人数。
*/


#include "stdio.h"
//以前都是采用数组模拟,这次目测数据过大,绝壁无法用数组去模拟,无法模拟怎么办!!找规律!!
//其实因为这题做过,影响深刻啊啊啊啊啊才知道找规律。  
int ans(int n,int m)
{
	if(n==m)
    {
    	return m;
    }
    else
    {
    	n=ans(n-n/m,m);
    	return (n-1)/(m-1)+n;//妈蛋 直接写进去居然TLE,目测多做了一倍无用的运算啊。
    }
}
int main(int argc, char const *argv[])
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n,m;
        scanf("%d%d", &n,&m);
        printf("%d\n",ans(n,m));
    }
    return 0;
}


你可能感兴趣的:(c,水题)