UVa Dropping Balls

题目链接:

https://cn.vjudge.net/problem/UVA-679

 1 /*
 2 问题
 3 输入完全二叉树的层数D和有几个小球滚落,计算最后一个小球落入的叶子结点的小号。
 4 
 5 解题思路
 6 直接模拟超时,所以想想其他的办法。看看能不能直接计算最后一个小球的路线,可以知道前两个球必然是一个落入左子树,
 7 一个落入右子树,那么对于给出的第I个编号的小球,如果I是奇数,它就是往左走的第(I+1)/2个小球,当I是偶数的时候,
 8 它就是往右走的第I/2个小球。 
 9 */ 
10 #include<cstdio>
11 int main()
12 {
13     //freopen("E:\\testin.txt","r",stdin);
14     int t,D,I;
15     while(scanf("%d",&t) == 1 && t != -1){
16         while(t--){
17             scanf("%d%d",&D,&I);
18             int k=1;
19             for(int i=0;i<D-1;i++){
20                 if(I&1){
21                     k =k * 2;
22                     I=(I+1)/2;
23                 }
24                 else{
25                     k = k*2+1;
26                     I = I / 2;
27                 } 
28             }
29             printf("%d\n",k);
30         }
31     }
32     return 0;
33 }

猜你喜欢

转载自www.cnblogs.com/wenzhixin/p/9129746.html