算法:配对游戏(美团)

美团点评是综合性生活服务平台,覆盖吃喝玩乐。在休闲娱乐版块,有很多轰趴、桌游、密室逃脱类的项目,适合多人一起玩。下面就是出自团队游戏场景中的一个问题。

有 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]);

猜你喜欢

转载自blog.csdn.net/qq_37355731/article/details/79660053