二叉树 小球下落 优化算法

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

/*题目大意,一个小球 从二叉树的上方往下掉。
二叉树 1
2 3
4 5 6
78 910
。。。

每个节点是一个开关,开关关闭往左掉,开关开着往右掉。初始时全部关闭。
输入二叉树的深度deep<=20,球的个数n,最后一个小球最后掉在哪个编号的袋子中。可能又10000组数据。

//自己写的(低效) #include<stdio.h> #include<string.h> #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<deep;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<stdio.h> int main() { int deep,n,i,k; while(scanf("%d%d",&deep,&n)!=EOF) { k=1; for(i=1;i<deep;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; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值