二叉树--uva 679 Dropping Balls 二叉树数组模拟

来源:互联网 发布:音效网 知乎 编辑:程序博客网 时间:2024/06/07 20:32

题意:n组数据,每组给定树的深度d和球的个数i,求每组第i个球组后落在哪。

分析:模拟球下落的过程即可。

思路一:对于每组球,模拟开关的状态,一个一个下落,最后获得结果。超时了妥妥的。

/*@Filename:    code.cpp@Author:    wyl6 @Mail:ustbcs_wyl@163.com@Thought:*/#include <cstdio>#include <cstdlib>#include <iostream>#include <stack>#include <queue>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <bitset>#include <list>#include <sstream>#include <set>#include <functional>using namespace std;int a[1<<20];int main(){int n,D,I;    scanf("%d",&n);    while(n--) {        scanf("%d%d",&D,&I);    memset(a,0,sizeof(a));//这一个就已经超时了    int k;    int m = (1<<D)-1;    for (int i = 0; i < I; ++i){    k = 1;    while(1) {        a[k] = !a[k];//改变状态        k = a[k]? 2*k:2*k+1;    if(k > m) break;    }    }    printf("%d\n",k/2);}return 0;}


思路二:每组球都会下落d-1次,而下到每层的时候,第偶数个往右,第奇数个往左,可以直接模拟第i个球的状态。

/*@Filename:    code.cpp@Author:    wyl6 @Mail:ustbcs_wyl@163.com@Thought:*/#include <cstdio>#include <cstdlib>#include <iostream>#include <stack>#include <queue>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <bitset>#include <list>#include <sstream>#include <set>#include <functional>using namespace std;int n,D,I;int main(){    scanf("%d",&n);    while(n--) {        scanf("%d%d",&D,&I);    int k = 1;    for (int i = 0; i < D-1; ++i)    if(I%2 == 0) {k = 2*k+1;I /= 2;}    else{k = 2*k;I = (I+1)/2;}    printf("%d\n",k);}return 0;}
参考:算法竞赛入门经典(刘大爷)第6章

原创粉丝点击