剪绳子
剪绳子
链接:https://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8?f=discussion
来源:牛客网
数学解释
问题类似于定周长求最大面积的问题(例如给定四边形周长,求最大面积),当k[0]==k[1]==,==k[m]时乘积最大,设k[0]=x,那么n=x*m,乘积可以用下式表示
f(x)=(x)^(n/x)
下面是f(x)的导数:
乘积函数在n/m=e的时候,取得最大值,可知,当x∈(0,e)时f(x)单调递增,当x>e时,单调递减,因此,在x=e时取得最大值,e≈2.718,是自然对数。
从函数图像上也可以看出这一点
f(x)的函数图像
又因为x的取值只能为整数,且f(3)>f(2),所以,当n>3时,将n尽可能地分割为3的和时,乘积最大。 当n>3时,有三种情况,即n%3==0, n%3==1, n%3==2,如下所示
上式中除法向下取整
当n≤3时,只有
当n==2时f(x)=1;
当n==3时f(x)=2;
Java实现
根据上述描述,可以给出以下代码
/** * @author yize * @param n 绳子长度 * @return */ public static int cutRope(int n) { if(n==2){ return 1; }else if(n==3){ return 2; } if(n%3==0){ return (int)Math.pow(3,n/3); }else if(n%3==1){ return 4*(int)Math.pow(3,n/3-1); }else { return 2*(int)Math.pow(3,n/3); } }