UVA 679 - Dropping Balls

题目大意:一棵满二叉树,最多20层,有D层,每个节点都有一个开关,初始状态全为关,球经过开关,开关状态改变。每个球从根节点往下掉,节点开,则往右,关则往左。

解题思路:小紫二叉树第一题。两种思路,第一种暴力,数据太大会爆。第二种,I号为奇数时,从根节点往左,在左字数,他是作为经过该节点的第(I+1)/2个,在判断往左往右。I号为偶数时,从根节点往右,在右子树,他是作为经过该节点的第I/2个。每层往下走,没走一层,I变为在该节点是第几个经过的球,往左是第(I+1)/2个,往右是第I/2个。而这层编号为k,下一层编号是往左是2*k,往右是2*k+1,因为第一层编号都为1,作为进入循环入口,循环次数就比层数少一。没有小紫难想到。。。

ac代码:

#include <iostream>
using namespace std;
int main()
{
	int n, I, D, k;
	while (scanf("%d", &n) != EOF && n >= 0)
		while (n--){
			scanf("%d%d", &D, &I);
			k = 1;
			for (int i=1; i<D; i++){
				if (I%2)
					k = 2 * k, I = (I + 1) / 2;
				else
					k = 2 * k + 1, I = I / 2;
			}
			printf("%d\n", k);
		} 
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值