题目链接:
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 ",k); 30 } 31 } 32 return 0; 33 }