小猴子下落(计蒜客)

有一颗二叉树,最大深度为 DD,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为 1,2,3,\cdots1,2,3,⋯,22 的 DD 次方减 11。在结点 11 处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。

一些小猴子从结点 11 处开始往下跑,最后一个小猴儿会跑到哪里呢?

输入格式

输入二叉树叶子的深度 DD,和小猴子数目 II,假设 II 不超过整棵树的叶子个数,D \le 20D20,最终以 000 结尾。

输出格式

输出第 II 个小猴子所在的叶子编号。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

4 2
3 4
0 0

样例输出

12
7

算法:递推
思路:如果当前节点的猴子数量是奇数,那么猴子往左边走,否则猴子往右边走;
猴子每往下面走一层,递推出每层猴子的数量,整个大循环递推层数
往左走k = 2*k,往右走k=2*k+1

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>

using namespace std ;

int main(){
    int n, d ;    
    while(cin >> d >> n , d||n){
        int ans = 1 ;
        for(int i=1;i<d;i++){
            if(n%2){
                ans *= 2 ;
                n = (n+1)/2 ;
            }else{
                ans = ans * 2 + 1 ;
                n /= 2 ;
            }
        }
        cout << ans << endl ;
    }
    return 0 ;
}
 

...

猜你喜欢

转载自www.cnblogs.com/gulangyuzzz/p/12465073.html
今日推荐