UVA 679 Dropping Balls

思路:

因为小球落下后,开关的状态就会改变,所以一个节点上的小球的去向,跟这个小球是第几个到达此节点

有关系,也就是说,如果到达时是第奇数个,往左走,偶数个,就要往右走;

比如,如果是节点1,那么我们可以知道,第一个小球(I=1)肯定是往左走,第二个小球(I=2)则是往右走;

也就是球到达的编号为奇数,则往左走,偶数往右走;

那么如果是节点2呢,如果把节点2看成节点1,其实也有规律;

比如第5颗球,他是第五个到达节点1的球,接下来往左,第5/2+1=3(奇)个到达节点2的球,

接下来往左,3/2+1=2(偶),第2个到达节点4,下面第2/2=1个到达节点9;

说来说去就是,球到达每个节点的编号决定了它下一步的方向,于是,我们只需要模拟最后一颗球,

就可以得到结果。

还要注意,二叉树的结构是

 

所以节点编号计算是往左k*2,往右k*2+1。

 

 1 #include<cstdio>
 2 int main() {
 3     int T, D, I;
 4     scanf("%d", &T);
 5     while (T--)
 6     {
 7         scanf("%d%d", &D, &I);
 8         int k = 1;//k是当前节点的编号
 9         for (int i = 0; i < D - 1; i++)
10         {
11             if (I % 2) //奇数,是往左走的,第(I + 1) / 2个小球
12             { 
13                 k = k * 2;
14                 I = (I + 1) / 2; 
15             }
16             else //偶数,往右,第I/2个
17             { 
18                 k = k * 2 + 1;
19                 I /= 2; 
20             }
21         }
22             printf("%d\n", k);
23     }
24     return 0;
25 }

 

posted @ 2019-02-21 16:47  付玬熙  阅读(140)  评论(0编辑  收藏  举报