Loading

[题解] 分竹子

传送门-力扣

题解

题目描述

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   
posted @ 2025-10-06 00:37  Chase_Tsai  阅读(6)  评论(0)    收藏  举报