首页 > 其他 > 详细

Uva 679 Dropping Ballls 二叉树的编号

时间:2017-02-12 01:06:17      阅读:290      评论:0      收藏:0      [点我收藏+]

这个程序常规处理起来数据量很大,I可以高达2^D-1

/*

.......

*/

里面的代码块据此避免了开太大的数组

做太多的循环

#include<cstdio>
#include<cstring>
const int maxd=20;
int s[1<<maxd];//最大结点数2^maxd-1
int main(){
	int D,I;
	/*
	while(scanf("%d%d",&D,&I)==2){
		int k=1;
		for(int i=0;i<D-1;i++)
			对I作判断,这里I是当前结点所遇到的第I个小球
		if(I&1){
			k=2*k;
			I=(I+1)/2;//I奇数,第(I+1)/2个往左走
		}
		else{
			k=k*2+1;
			I/=2;//I偶数,第I个往右走
		}
		printf("%d",&k);//到达D-1层即叶子结点则输出K
	}
    */
	while(scanf("%d%d",&D,&I)==2){
		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]?2*k:2*k+1;//闭左开右
				if(k>n) break;//出界
			}
		}
	printf("%d",k/2);//到叶子结点中去找原来的父结点
	}
	return 0;
}

  

 

Uva 679 Dropping Ballls 二叉树的编号

原文:http://www.cnblogs.com/mdz-great-world/p/6390331.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!