您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页剪绳子(C++ 高数推导)

剪绳子(C++ 高数推导)

来源:叨叨游戏网

一、题目

给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,2≤n≤58并且m≥2)。

每段的绳子的长度记为k[1]、k[2]、……、k[m]。

k[1]k[2]…k[m]可能的最大乘积是多少?

例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。

样例
输入:8

输出:18

二、思路 

这道题就是高数的应用题,感受到了高数的魅力哈哈哈哈。

因为绳子总长为n,分成m段,我们要求的是每段绳子多长才能使绳子的长度乘积最大。

就是高数的求导求极值问题。

解:设绳子总长为n,每段长度为x,分成m段,故有n=mx,设y为绳子长度乘积,所以

咳咳,打公式太麻烦,直接手写推导。

驻点x0=e,x在0到e,y递增,x在e到正无穷,y递减,所以e点取得极值,极大值,整个区间只有一个极值点,e点就为最值点,最大值点。

因为x要取整数 所以选择2、3,至于选择2好还是选择3好,带入算一下

取3要更好一点。

三、代码实现

思路确定下来了,代码就很简单了。

class Solution {
public:
    int maxProductAfterCutting(int n) {
        if(n <= 3) return 1 * (n - 1);
        int res = 1;
        if(n % 3 == 1) res = 4,n -= 4;
        else if(n % 3 == 2) res = 2,n -= 2;
        while(n) res *= 3,n-=3;
        return res;
    }
};

四、总结

其实之前也有做过这个题,一直没去想为啥取3、2,那么多数字为啥选择你俩。

今天看到推导,醍醐灌顶,就彻底懂了,高数真的是很神奇,第一次感觉到代码和数学有关系,有一个良好的数学思维真的很重要,自己压根想不到把它当做数学题解,这明明就是大一高数最简单的求极值问题啊。。。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务