一定数量的小球在一定深度的二叉树上下落,求最后一个小球落到的树叶的序号。
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
int main()
{
int num;
int I,D;int k;
long long int temp;
long long temp1;
while(cin>>num)
{
if(num==-1)break;
for(int i=0;i<=num-1;i++)
{
cin>>D>>I;
for(int ii=0;ii<=I-1;ii++)
{
k=1;
for(int dep=1;dep<=D-1;dep++)
{
if( I%2 == 1 )
{
I = (I+1)/2;
k*=2;
}
else if(I%2 == 0)
{
I = I/2;
k=2*k+1;
}
}
}
cout<<k<<endl;
}
}
}
对于每一个下落的小球来说,它落到每个节点上该往哪个方向走,取决于他是落在该节点上的第几个小球,只要是奇数个落在这上面的,那他就要向左走,偶数向右。而最后一个小球是位于这个节点的最后一个落到这里来的(/2或者是(+1)/2表示的是曾经有一半个小球落到这里并触发开关)。