小猴子下落

来源:互联网 发布:淘宝账户限制登录 编辑:程序博客网 时间:2024/04/30 10:27

小猴子下落

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

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

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

输入
输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾
输出
输出第I个小猴子所在的叶子编号。
样例输入
4 23 40 0
样例输出
127 



解题报告:找规律。仔细观察会发现,如果某一个人的编号是奇数就会走左边,偶数就会走右边,然后除叶子层外每一层都判断一次。


code:

#include<iostream>#include<stdio.h>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=50;typedef long long ll;int main(){    freopen("input.txt","r",stdin);    int d,n;    while(~scanf("%d%d",&d,&n)){        if(d==0 && n==0)            break;        int num=1; //最终编号        for(int i=0;i<d-1;i++){            if(n%2==0){                num=num*2+1;                n/=2;            }else{                num*=2;                n=(n+1)/2;            }        }        printf("%d\n",num);    }    return 0;}



1 0
原创粉丝点击