题目链接:https://vjudge.net/problem/UVA-679
题目大意:t组样例,每组包括D M 层数是D 问第M个小球落在哪个叶子节点? 每个节点有开关 刚开始全都是关闭的,小球走到节点 节点开关变为与当前相反 每个小球从根节点释放
思路:这题是第一道二叉树遍历的题目,二叉树暴力模拟的确可以求出答案 ,但是很不幸,会超时
然后另一种方法,只需要求第M次小球就行了! 怎么求呢? 试想一下,如果M为奇数 那么从根节点开始看,肯定是往左走(M+1)/2次 往右走M/2次 但是最后一次肯定是往左走的
同理,如果M是偶数 显然 往左走M/2次 往右走 M/2次 显然最后一次是往右走的 这就是做这题的思想了 然后往复此过程 !
看代码:
#include<iostream> using namespace std; int main() { int t; int n,m; while(cin>>t) { if(t==-1) break; while(t--) { int ans=1; cin>>n>>m; for(int i=1;i<n;i++)// { if(m%2==1) //最后一次肯定往左子树走 且走的次数为(m+1)/2 { m=(m+1)/2; ans=ans<<1; } else//往右子树走 { m=m/2; ans=ans<<1|1; } } cout<<ans<<endl; } } return 0; }