[题解] 分竹子
题目描述
将 bamboo_len 的竹子砍为若干整数段, 求每段竹子长度的最大乘积. 2 <= bamboo_len <= 58
分析
设将长度为 \(s\) 的竹子分为 \(n\) 段, 每段分别为 \(a_1, a_2, \cdots, a_n\) , 问题转化为求 \(\max a_1a_2\cdots a_n\)
由均值不等式: \((a_1a_2\cdots a_n)^{1/n} \leqslant \frac{a_1 + a_2 +\cdots + a_n}{n}\) , 当且仅当 \(a_1 = a_2 = \cdots a_n\) 时取等, 此时 \(a_1a_2\cdots a_n = (\frac{a_1+a_2+\cdots+a_n}{n})^n = (\frac{s}{n})^n\) .
取对数得 \(n \ln \frac{s}{n} = n \ln s - n \ln n\) , 求导得 \(\ln s - 1 - \ln n\) , 则当 \(\frac{s}{n} = e\) 时导数为 \(0\) , 取得最大值. 此时 \(n = \frac{s}{e}\) , 每段长 \(\frac{s}{n} = e\) , 再代入 \(\frac{s}{n} = 2\) 和 \(\frac{s}{n} = 3\) , 算得 \(\frac{s}{n} = 3\) 时乘积更大, 所以尽量分为长度为 \(3\) 的段.
代码
class Solution:
def cuttingBamboo(self, bamboo_len: int) -> int:
if bamboo_len <= 3:
return bamboo_len - 1
left = bamboo_len % 3
k = bamboo_len // 3
if left == 0:
return 3 ** k
elif left == 1:
return 3 ** (k - 1) * 4
else:
return 3 ** k * 2

浙公网安备 33010602011771号