蜡烛燃烧(阿里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}')


#阿里巴巴##题解#
全部评论
要不要来字节我们部门试试,商业变现部门
点赞 回复 分享
发布于 2021-03-21 15:17
**!我的锅,我没注意审题,原来最多只能切两刀 T_T,不好意思啊,我***了...
点赞 回复 分享
发布于 2021-03-17 12:56
递推方程应该是这样,但是我不会解...,讲道理解出来应该就是偶数折半,奇数折半+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
您好,我手算验证了一下,似乎和我计算的结果不太一样诶,例如 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

相关推荐

不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
练习生懒羊羊:开飞机把这个公司创飞吧
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 11:16
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务