小球下落

来源:互联网 发布:淘宝店管理软件 编辑:程序博客网 时间:2024/04/27 04:20

题目:


#include<stdio.h>#include<time.h>#include<string.h>#define  MAX 20int s[1<<MAX];int main(){int D,I,k,n,i;double s1,s2;while(scanf("%d%d",&D,&I) != EOF){s1=clock();memset(s,0,sizeof(s));n=(1<<D)-1;for(i=0; i< I; i++){k=1;for(;;){s[k]= !s[k];k= s[k] ? k*2 : k*2+1;if(k>n)break;}}s2=clock();printf("%d\tEscape Time:%lf s\n",k/2,(s2-s1)/CLOCKS_PER_SEC);}return 0;}
输入测试数据

4 2
3 4
10 1
2 2
8 128
16 12345
18 62144
20 948000

输出:

这个程序运算量太大,一定会超时的..................

第二个运算要比第一个快很多,这是逆推编号I小球的路径,因为每个小球都会落到根结点上,前两个小球必然一个在左子树,一个往右子树。一般地,只要看小球编号,就知道它是第几个小球产生的。

#include<stdio.h>#include<time.h>#include<stdlib.h>int main(){int D, I, k, i;double s1,s2;while(scanf("%d%d",&D, &I) != EOF){s1=clock();k=1;for(i=0; i< D-1; i++)if(I%2){k=k*2;I = (I+1)/2;}else{k=k*2+1;I /= 2;}s2=clock();printf("%d\tEscape Time:%lf m\n",k, (s2-s1)/CLOCKS_PER_SEC);}return 0;}

输出效果:



0 0
原创粉丝点击