蜡烛燃烧(阿里3.15笔试)

一根长度为 n 的蜡烛,随机分成两段(一共有 n-1 种分割方式,假设概率均等),将两段蜡烛同时燃烧,如果一根燃尽,另一根还剩长度 >= 2,则把剩余这根蜡烛继续切分,然后分别点燃,直到蜡烛燃尽。注意第二次切分之后不再继续切分。
求蜡烛燃尽的期望时间。
不确定对不对。。。
# Python 3
def time_second(n: int) -> float:
    n1 = n >> 1 # n // 2
    if n & 1:     # odd
        return n1 * (n1 + n) / (n - 1)
    else:
        return n1 * (n1 + n - 2) / (n - 1)

def candle(n: int) -> float:
    n1 = n >> 1 # n // 2
    if n & 1:     # odd
        tot = n + 1 # (n // 2 + 1)* 2 
    else:
        tot = n1
    
    tot += (n1 - 1) * n1
    for i in range(1, n1):
        tot += time_second(n - i - i) * 2
    return tot / (n - 1)

# TEST
n = 4
res = candle(n)
print(f'{res: .4f}')


#阿里巴巴##题解#
全部评论
您好,我手算验证了一下,似乎和我计算的结果不太一样诶,例如 n = 6 的时候,我手算的结果是 3,您的程序的结果是 3.2666。我猜这个题目的代码应该是这样? ``` def candle(n):   if n & 1 == 0: return n // 2   else: return (n // 2) + 1 ``` 下图是我手算的过程:
点赞 回复
分享
发布于 2021-03-17 11:06
递推方程应该是这样,但是我不会解...,讲道理解出来应该就是偶数折半,奇数折半+1。对应的代码如下: ```  def E(n):                                                if n == 1&nbs***bsp;n == 2: return 1                        e = 0                                                if n % 2 == 0:                                           for i in range(1, int((n - 2) / 2) + 1):                 e += (2 / (n - 1)) * (i + E(n - 2 * i))          e += (1 / (n - 1)) * (n / 2)                         return e                                         else:                                                    for i in range(1, int((n - 1) / 2) + 1):                 e += (2 / (n - 1)) * (i + E(n - 2 * i))          return e                                    ```
点赞 回复
分享
发布于 2021-03-17 12:37
百信银行
校招火热招聘中
官网直投
**!我的锅,我没注意审题,原来最多只能切两刀 T_T,不好意思啊,我***了...
点赞 回复
分享
发布于 2021-03-17 12:56
要不要来字节我们部门试试,商业变现部门
点赞 回复
分享
发布于 2021-03-21 15:17

相关推荐

1 4 评论
分享
牛客网
牛客企业服务