UVa679
小球沿着一个满二叉树形状的装置下落,树中每一个节点都有一个开关来控制与左子节点和右子节点的连通性,每当有小球经过该节点时,开关的状态都会改切换。根据树的深度和放入装置的球的编号,求出小球最终停留在哪个叶子节点。
由于是满二叉树(也就是二叉堆),因此是有规律的,可以不用模拟每个小球的下落过程来确定开关的最终状态,直接根据小球的编号即可以模拟该球的下落过程,具体的规律自己画一画就出来啦 😃😃😃
#include <iostream>
using namespace std;
int GetStopPosition(int D, int I)
{
int root = 1;
for (int d = 0; d < D - 1; d++)
{
if (I % 2 == 0) {
root = 2 * root + 1;
I /= 2;
}
else {
root = 2 * root;
I = (I + 1) / 2;
}
}
return root;
}
int main()
{
int cases;
cin >> cases;
for (int i = 0; i < cases; i++)
{
int D, I;
cin >> D >> I;
cout << GetStopPosition(D, I) << endl;
}
cin >> cases;
return 0;
}
/*
5
4 2
3 4
10 1
2 2
8 128
-1
*/