美团点评是综合性生活服务平台,覆盖吃喝玩乐。在休闲娱乐版块,有很多轰趴、桌游、密室逃脱类的项目,适合多人一起玩。下面就是出自团队游戏场景中的一个问题。
有 n 个人排成一排,一开始全部面向前方,然后大家一起转身,随机朝左或是朝右转。
转身后,不断检查队列,如果存在两个面对面的相邻的人,则将这两个人从队列中消除;直到不存在两个面对面的相邻的人。
例如 > 表示向右, < 表示向左
队列“>>><<<”的消除过程为,“>>><<<”到“>><<”到“><”到“”(每次去除一对),最后剩下人数为0。
队列“>><><<<>”的消除过程为,“>><><<<>”到“>><<<>”到“><<>”到“<>”(每次去除一对),最后剩下人数为2
求最后剩下人数的期望值。
输入描述:
一行一个正整数 n (1 ≤ n ≤ 2000)。
输出描述:
一行一个实数,表示剩下人数的期望值,四舍五入保留三位小数。
实例1:
输入
10
输出
4.168
思路:运用递推,当n=1时,那么期望f(1)=1
当n =2 时,那么期望f(2)=1.5=[(1/2*1/2)*0+3/4*2]/2
<< >>
<> ><为0
当n=3时,那么期望f(3)=2 =(12+4)/2
<<< ><<为1
<<> ><> 为1
<><为1 >><为1
<>> >>>
那么当n=4时,那么期望值f(4)=44/16=11/4
<<<< <<<> <<>< <<>>
<><< <><> <>>< <>>>
><<< ><<> ><>< ><>>
>><< >><> >>>< >>>>
观察规律:当只消掉一对<>时 留下的为 << >> <> ><
代码:
链接:https://www.nowcoder.com/questionTerminal/8a68ffd4560744da82c9040af3bead9e
来源:牛客网
f[1]=1;f[2]=1.5;f[3]=2;
for(int i=4;i<=n;i++)
f[i]=(-(i-2)*f[i-3]+(i-3)*f[i-2]+(i+1)*f[i-1])/i;
printf("%.3lf\n",f[n]);