题目描述
描述
有N个士兵站成一队列, 现在需要选择几个士兵派去侦察。
为了选择合适的士兵, 多次进行如下操作: 如果队列超过三个士兵, 那么去除掉所有站立位置为奇数的士兵,
或者是去除掉所有站立位置为偶数的士兵。直到不超过三个战士,他们将被送去侦察。现有一个“聪明”的士兵,
经常通过选择站在合适的初始位置,成功避免被选中去侦察。这引起了陈教官的注意。陈教官希望你编写一个程序,
当给定士兵数之后,输出不可能被选中去巡逻的最少编号位置(如果不存在不可能被选中的位置,则输出0)。
注: 按上法得到少于三士兵的情况不用去巡逻。
1 <= N <= 100000
输入格式
有多行(不多于20行),每行一个数字N,最后一行是0
输出格式
对每一行的数字N,不可能被选中去巡逻的位置数
直到没有数字
输入样例
9
6
0
输出样例
2
0
tip
这道题目就和上课时讲的一样,用递归法就可以解决了。递归所用到的函数F(x,y,z),x代表目前有多少个数,y代表最小的数,z代表两个数之间的差值。我们不难发现,随着操作次数的增加,差值每次都翻两倍。这里要注意,每次取走偶数位时,奇数位的最小位是不变的。还有就是要判断总数的奇偶性,如果总数为奇数的话,取奇数的操作时,他的总数是x/2+1.
代码如下:
#include <iostream>
#include <map>
#include <cstdio>
#include <