剪绳子后面的数学原理

先来看一个一般性问题:
周长一定为n,这时候长length与宽width在什么情况下,达到面积s最大

s = length * width
设length = x
则:width = n/2 - x

所以 s = x * (n/2 - x)

= -x^2 + n*x/2

求导s' = -2x + n/2
s' = 0 --> 得 x = n/4
(0,n/4)区间,s'>0,S单调递增
(n/4, n)区间,s'<0,S单调递减
n/4为极大值点
所以在长度x=n/4的时候,S的面积最大
width = n/2 - x
= n/2 - n/4
= n/4
所以width = length 的时候 s最大

通过一般性问题得出当定长的时候,截出的子段长度相等的时候,乘积最大

(通用性待数学求证)
基本不等式的定理可知:算术平均数 > 几何平均数

回到本题

绳子长度为n,分成m分,那先设每分长度为x, 份数m=n/x

那么结果就是 n/x个 x 相乘 f(x)=x^(n/x)

求导:如下图
图片说明

f(2) = 2^(n/2),f(3) = 3^(n/3)

所以问题就回到了n/3的个数上面
当n能被3整除的时候,乘积=3^(n/3)
当n除3余1的时候,这时候发现多了一个1,这个1是不是很鸡肋,但是把前面的一个3拿出来,把这个一个1和前面一个3 分解为2和2,就变大了,所以乘积为 3^(n/3 - 1) * 4
当n除3余2的时候,乘积为3^(n/3) * 2

public int cutRope(int target) {

    if(target<=0) return 0;

    if(target==1 || target == 2) return 1;

    if(target==3) return 2;

    int m = target % 3;

    switch(m){

        case 0 :

            return (int) Math.pow(3, target / 3);

        case 1 :

            return (int) Math.pow(3, target / 3 - 1) * 4;

        case 2 :

            return (int) Math.pow(3, target / 3) * 2;

    }

    return 0;

}

牛客地址:https://blog.nowcoder.net/n/915eab44a70b49ef92abdc93f8993432

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值