NYOJ63小猴子的下落
来源:互联网 发布:php进阶书籍 编辑:程序博客网 时间:2024/04/27 05:46
小猴子下落
时间限制: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
- 开始的时候对题目的理解除了问题,不知道是所有的节点的状态都会改变还是只改变猴子经过节点的状态,后来看了解题报告后恍然大悟了,就是单个节点的状态改变了。
- 其实这题目不难,关键的是得有点宏观的思想。
- 先从第一个节点开始,初始状态时关闭的,当第一只猴子经过时,状态改变,以此类推,一只猴子经过,改变一次,一只猴子经过改变一次,由此我们发现,奇数猴子关闭往左,偶数猴子打开向右。于是我们推出了第I只猴子在第一个节点处的走向。
- 其它节点也是同样的,不过每一层状态的改变次数都会比上层的减半。理解了吧?下面是代码。
- #include
- int main()
- {
-
intd,i; -
while(scanf("%d%d",&d,&i)&&(i+d)){ -
int k=1; -
for(int j=0;j -
if(i%2==0){ -
k=k*2+1;i=i/2;//往右走后达到的位置, -
}else{ -
k=k*2;i=(i+1)/2; -
} -
} -
printf("%d\n",k); -
} - }
- 还有一种高上大的写法哦:
- #include
- int main()
- {
-
inti,value,depth,base,newValue; -
while(scanf("%d%d",&depth,&value)&&depth||value) -
{ -
for(i=base=1;i -
base<<=1; -
for(value--,newValue=i=0;i -
{ -
newValue=(newValue<<1)+(value&1); -
value>>=1; -
} -
printf("%d\n",newValue+base); -
} -
return 0; - }
0 0
- NYOJ63小猴子的下落
- NYOJ63小猴子下落
- NYOJ63小猴子下落
- nyoj63 小猴子下落
- NYOJ63 小猴子下落 【模拟】
- NYOJ63——小猴子下落
- nyoj63小猴子下落(简单模拟)
- NYoj63-小猴子下落 -二叉树
- nyoj63 小猴子下落 (二叉树)
- NYOJ63 小猴子下落(二叉树性质)
- 小猴子下落nyoj63(一道可以直接写的好题)
- NYOJ63 小猴子下落 (模拟二叉树)
- nyoj63小猴下落问题
- acm 小猴子的下落的理解
- NYOJ--63题小猴子的下落
- 一个有意思的题-小猴子下落
- NYOJ-63-小猴子的下落
- 小猴子下落
- 十大SQL注入攻击工具
- 常见端口号
- 60余款WordPress日志插件/文章编辑…
- NYOJ-33蛇形填数
- 利用逆波兰表达式求算数表达式的值
- NYOJ63小猴子的下落
- 汉诺塔(三)栈的应用NYOJ93
- NYOJ117求逆序数
- NYOJ119士兵杀敌(三)RMQ问题之ST…
- NYOJ123士兵杀敌(四)
- NYOJ128前缀式的计算递归求解当时…
- NYOJ722数独
- 递归三部曲之深入理解斐波那契数列
- NYOJ4324 Point game