java小球下落_二叉树 小球下落 优化算法

本文介绍了通过优化算法解决Java小球下落问题,对比了低效和高效的解决方案。算法书上的优化方法利用奇偶性判断小球掉落方向,减少了数组使用和运算次数,提高了效率。
摘要由CSDN通过智能技术生成

今天在算法书上看了一题,得到点感触,算法优化后效率可以提高很多。    所以不要停留在AC 的层面,AC了还应思考算法的效率。

/*题目大意,一个小球 从二叉树的上方往下掉。

二叉树               1

2   3

4   5   6

7   8   9  10

。。。

每个节点是一个开关,开关关闭往左掉,开关开着往右掉。初始时全部关闭。

输入二叉树的深度deep<=20,球的个数n,最后一个小球最后掉在哪个编号的袋子中。可能又10000组数据。

//自己写的(低效)

#include

#include

#define MAXN 1024*1024

int a[MAXN];

int main()

{

int deep,n,i,j,k;

while(scanf("%d%d",&deep,&n)!=EOF)

{

memset(a,0,sizeof(a));

for(i=1;i<=n;i++)

{

k=1;

for(j=1;j

{

if(!a[k]) //开关关闭

{

a[k]=1; //开启开关

k=2*k; //往左走

}

else //开关开启

{

a[k]=0; //关闭开关

k=2*k+1; //往右掉

}

}

}

printf("%d\n",k);

}

return 0;

}

//下面是算法书上看到的算法。用奇偶判断掉落方向,直接模拟最后一个球的路径。

//省去了大数组,省了很多运算 。

#include

int main()

{

int deep,n,i,k;

while(scanf("%d%d",&deep,&n)!=EOF)

{

k=1;

for(i=1;i

{

if(n%2) //如果是第奇数个球

{

k=2*k; //往左走

n=(n+1)/2; //同时,这个球是下一个节点的第(n+1)/2 个球

}

else //如果是第偶数个球

{

k=2*k+1; //往右走

n=n/2; //这个球是下一个节点的第n/2 个球

}

}

printf("%d\n",k);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值