https://blog.csdn.net/weixin_41676901/article/details/80587473
上一篇的代码中由于2^maxn太大,数组可能会出界导致running error,我们可以设计一个与小球的编号无关的程序,这样就可以节省了一个巨大的a数组。
参考:算法竞赛入门经典
①:每个小球都会落在根节点上,因此前两个小球必然是一个在左子树,一个在右子树。
②:一般,只需要知道小球编号的奇偶性,就能知道它是最终在哪棵子树中。
③:对于那些落入根结点左子树来说,只需知道该小球是第几个落在根的左子树里的,就可以知道它下一步该往左还是往右了。以此类推,直到小球落到叶子结点上。
代码:
#include<iostream>
#include<string.h>
using namespace std;
//const int maxn = 20;
//int a[1 << maxn];//结点的最大数为2^maxn-1个
int main()
{
int D, I;
while (cin >> D >> I)
{
int k = 1;
for (int i = 0; i < D - 1; i++)
{
if (I % 2)//奇数
{
k = 2 * k;
I = (I + 1) / 2;
}
else
{
k = k * 2 + 1;
I = I / 2;
}
}
cout << k << endl;
}
return 0;
}