zoukankan      html  css  js  c++  java
  • 整数拆分最大乘积

    其实是一个挺 trivial 的东西吧,事实上早在今年 1 月,我就在 CF986D 这道题中见过这个东西,今天只是碰巧又遇到了个这样的题后把这东西单独拎出来配合上我自己瞎 yy 的证明后合成了一篇博客而已(bushi)

    模型:给定正整数 (n)​,要你构造出若干个由正整数组成的序列 (b_1,b_2,cdots,b_m)​​,使得 (sumlimits_{i=1}^mb_i=n)(prodlimits_{i=1}^mb_i) 最大。

    结论:设 (f(n)) 表示 (prodlimits_{i=1}^mb_i) 的最大值,那么有:

    [f(n)=egin{cases} 1&(n=1)\ 3^{n/3}&(nequiv 0pmod{3})\ 3^{(n-2)/3}·2&(nequiv 2pmod{3})\ 3^{(n-4)/3}·4&(nequiv 2pmod{3}&n e 1) end{cases} ]

    证明:我们先不考虑整数这个条件,先假定序列中的数可以是任意正实数,那么很容易发现的一个性质是,序列只能由相同的数组成,否则,假设序列中出现了 (x,y) 两种不同的数((x e y)),那么我们可以将它们都调整为 (dfrac{x+y}{2}),这样和不变并且乘积最大,也就是说我们假设序列中唯一的数为 (x),那么 (prodlimits_{i=1}^mb_i=x^{n/x}),我们要求当 (x) 为何值时,(x^{n/x}) 最大。

    考虑一个非常常用的套路:取 (ln)​,显然取完 (ln)​ 后式子可写作 (dfrac{n}{x}·ln x)​,此时 (n)​ 变成了常数可以把它拿走,故我们只需求出 (dfrac{ln x}{x}) 在何处取到最大值即可。再考虑求导,((dfrac{ln x}{x})’=dfrac{1-ln x}{x^2}),由于 (x>0)(ln x)((0,infty)) 上为增函数,(dfrac{1-ln x}{x^2}>0Leftrightarrow x<e),故 (x=e) 时上式取到最大值。

    也就是说,如果我们可以往序列里塞实数,那么我们肯定会选择往序列中塞满 (e),但是这里要求序列中的数必须是整数,该怎么办呢?

    注意到一个事实,那就是 (e=2.71828…approx 3),也就是说我们感性理解一下肯定会选择多拆出一些 (3),事实也确实是这样的,(3^2>2^3,3^4>4^3),而根据上面的分析,(x^{n/x}) 是单峰函数,因此极值点肯定在 (3) 附近取到,换句话说,如果这里的 (n) 足够整,整到它是 (1,2,3,cdots) 的公倍数,那么全拆 (3) 肯定比全拆 (2)(4)(5) 或 …… 更优。

    我们特判掉 (n=1) 的情况,此时答案肯定就是 (1)。如果 (n)(3) 的倍数那肯定全拆 (3) 最优。如果 (nequiv 2pmod{3}),那么全拆 (3) 后会剩一个零头,直接把这个零头单独分一组即可。如果 (nequiv 1pmod{3})(nge 4),这时需要格外注意,如果全拆 (3),最后会剩下一个 (1),由于乘以 (1) 等于啥也没有,因此这样反倒是不优的,正确方式是退一步,把最后一步的 (4) 拆成两个 (2),这样乘积可以达到最大值 (4·3^{(n-4)/3})

  • 相关阅读:
    node.js的request模块
    PHP实现一个简单url路由功能
    关于seajs
    CodeIgniter集成Smarty
    node.js批量修改图片名
    Node.js创建目录实例
    Bootstrap的表单设计器
    onbeforeunload事件被a链接触发的问题
    Socket.IO + Express实现的跨浏览器、子域的聊天室
    NodeJS获取命令行后面的参数
  • 原文地址:https://www.cnblogs.com/ET2006/p/986D-trick.html
Copyright © 2011-2022 走看看