UVa679(二叉完全树)

    题意:有一颗完全二叉树,小球自树上而向下滚落,每当小球滚过一个节点时,节点的方向开关便会被置反;

 

解题思路:由于是完全二叉树(k->left=2k,k->right=2k+1),可以将二叉树存储于数组中(模拟超时);每个小球都是由root向下滚落,开关的方向与这个小球处在第几次经过该节点有关,当小球标号为奇数I时,它是往左走的第(I+1)/2个小球,当I为偶数时,是往右走的第I/2个小球;  模拟小球路线;

#include<cstdio>
#include<cstring>
const int maxd = 20;
//int s[1<<maxd];
int main(){
	int D,I,T;
	scanf("%d",&T);
	for(int j=0;j<=T;j++){	
		scanf("%d",&D);
			if(D==-1) {
			break;	
			}
			scanf("%d",&I);
	/*		memset(s, 0, sizeof(s));
			int k, n = (1<<D)-1;
			for(int i = 0; i < I; i++){
				k = 1;
				for(;;){
					s[k] = !s[k];
					k = s[k] ? k*2 : k*2+1 ;
					if(k>n) break;
				
				}
			}    
			printf("%d\n",k/2); */
			int k = 1;
			for(int i = 0; i < D-1; i++)
			if(I%2) {
				k=2*k;
				I = (I+1)/2;
			}else {
				k = 2*k+1;
				I/=2;
			}
			printf("%d\n",k);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值