传送门
题目描述
将 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\) , 所以尽量分为长度为 \(3\) 的段.
代码
class Solution:def cuttingBamboo(self, bamboo_len: int) -> int: if bamboo_len <= 3:return bamboo_len - 1left = bamboo_len % 3k = bamboo_len // 3if left == 0:return 3 ** kelif left == 1:return 3 ** (k - 1) * 4else:return 3 ** k * 2