对于约瑟夫环的问题,在最近总是碰到,我也不知道为什么,所以从一开始的什么的不懂,到现在有很多方法可以解决了。
对于问题本身:就是一个环形的人圈,然后报数,报到规定的那个数的人就死。
对于这类问题,两种解决方案:
1、模拟法,模拟真实情况,循环,每到规定的数,就死人。
2、递推,根据已有的状况来推递推的公式。
第一种是我一开始做的想法,第二种是我时间超限之后网上搜来的。
下面给出递推公式:
for(int i = 2; i <= total; ++i)
{
last = (last + number) % i;
}
其中total是总人数,number是规定多少个数死一个人,last为最终结果。
但是对于这道题,因为这个规律只能知道最后一个存活的人,但是题目要求是存活一半的人,所以不适用。
然后我的解决方案是:利用这个公式去判断,然后加上模拟,最后打表,
因为测试数据只有13个而已,打表还是挺快的。