由于本人的头铁,坚持要写编程题讲解。所以昨天的文章发出去以后阅读量为4,我甚至怀疑是不是还在审核中orz,但是经过我的一番仔细检查发现,并没有,已经过审了,只是单纯的没人看而已(早就说没人看啦)...但是,即使是没人看,我也要写!(哪来的铁头憨憨,不就是为了申请原创凑三篇文章么)

话不多说,请听题:

说李华的学校要开联欢晚会,为了使每一个同学都参与进来,机智的主持人决定要带领观众席的同学们玩一个互动游戏,这个游戏叫——击鼓传花。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。这时爱思考问题(事多)的李华提出了一个十分有趣的问题:有多少种不同的方法可以使得从自己手里开始传的花,传了m次以后,又回到自己手里呢。对于传递的方法当且仅当以下这两种方法,接到花的同学按接球顺序组成的序列是不同的,才视作两种传花的方法不同。比如有3个同学1号、2号、3号,并假设李华同学为1号,花传了3次回到李华手里的方式有1->2->3->1和1->3->2->1,共2种。

计算机网络前端面试题总结(互联网公司笔试编程题之)(1)

计算机网络前端面试题总结(互联网公司笔试编程题之)(2)

答:节目都表演不完总是延迟结束就不要在这种无聊的游戏上浪费时间了好么(闭嘴)这道题我那乍一看还以为是道数学题,甚至想用排列组合,但是关键是双向传递给这个问题增加了难度。后来看了正确答案以后才想到。我们是在编程,要利用好数组等可以记录的优势。所以这道题其实非常简单,只要用数组记录下每一个同学被传到的概率就好了,从第一传开始,依次更新每一个同学的被传到概率表,也就是传到N号同学那么N-1和N 1号同学被传到的概率都要 1,这样传M次以后输出一号同学的概率就是答案。

以下是代码,已经通过OJ测试。

// #include<stdio.h>

// void main()

// {

// int n,m;

// int num[30];

// int temp[30];

// scanf("%d %d",&n,&m);

// for (int j = 0; j < n; j )

// {

// num[j]=0;

// temp[j]=0;

// }

// num[0]=1;

// temp[0]=1;

// for(int i = 1; i <= m; i )

// {

// for (int j = 0; j < n; j )

// {

// num[j]=temp[(j 1)%n] temp[(j-1 n)%n];

// //printf("%d ",num[j]);

// }

// for (int j = 0; j < n; j )

// {

// temp[j]=num[j];

// }

// //printf("\n");

// }

// printf("%d",num[0]);

// }

,