网址如下:
OpenJudge - 1012:Joseph
其中一个解法
只想到了一个快速找到下一位处决的人的方法,本质上还是遍历,暂时没想到更优的方法了
代码如下:
#include<cstdio>
int k;
bool judge(int tt, int m, int r){
if(tt == k) return true;
int num = (m - r) % tt; num = num ? num : tt;
if(num <= k) return false;
return judge(tt - 1, m, tt - num);
}
int main(void)
{
while(scanf("%d", &k) && k){
for(int m = 1; ; m++)
if(judge(k * 2, m, 0)){printf("%d\n", m); break;}
}
return 0;
}
快速找到下一个处决的人的方法
从我的代码可以看出来,用了一个递归函数进行判断该m行不行,因为k小于13,所以递归层数最多到14个,不用担心栈堆段内存爆炸
先说说各个变量代表的意义:
tt:剩下的总人数
m:和题目的m一样
r:在上次处决之后,处决的人的后面的坏人数(到第一个好人出现为止)
num:这次要处决的编号
简单来说就是保持队列的第一个是编号为1的好人,这样就可以直接取余得出要处决的人的编号,只需注意一下刚好整除的情况就行了