鱼C论坛

 找回密码
 立即注册
查看: 10742|回复: 42

[已解决]Python:每日一题 325

[复制链接]
发表于 2020-2-6 11:57:46 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 fan1993423 于 2020-2-6 22:21 编辑

接昨天康康的题目,改良一下。
是一个正数n(可以是整数,可以是小数),拆分成两个及其以上的正数(可整数可小数),求最大值?
(保留两位小数即可)!


欢迎大家来答题
最佳答案
2020-2-6 11:57:47
本帖最后由 TJBEST 于 2020-2-6 22:44 编辑

这题我就不写程序了,我把解题过程写在下面大家看看,完整的数学求解。觉得好的点个赞
0001.jpg
0002.jpg

最佳答案

查看完整内容

这题我就不写程序了,我把解题过程写在下面大家看看,完整的数学求解。觉得好的点个赞

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 11:57:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 TJBEST 于 2020-2-6 22:44 编辑

这题我就不写程序了,我把解题过程写在下面大家看看,完整的数学求解。觉得好的点个赞
0001.jpg
0002.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 13:08:27 | 显示全部楼层
支持楼主

不过楼主能给几个测试用例嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 14:33:45 | 显示全部楼层
zltzlt 发表于 2020-2-6 13:08
支持楼主

不过楼主能给几个测试用例嘛

我也不确定最后答案是什么,希望大佬能给出答案,如果有详细的数学推理过程还可以追加鱼币奖励
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 14:34:31 | 显示全部楼层
zltzlt 发表于 2020-2-6 13:08
支持楼主

不过楼主能给几个测试用例嘛

帮我高亮显示吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 14:34:48 | 显示全部楼层
本帖最后由 William4869 于 2020-2-6 15:14 编辑
def f325(x):
    if x<4:
        return (x/2)*(x/2)
    e=2.718281828459045
    num=x//e
    if pow(x/num,num)>pow(x/(num+1),num+1):
        return pow(x/num,num)
    else:
        return pow(x/(num+1),num+1)

print(f325(0.5))



稍作修改,仅仅猜测

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +2 收起 理由
fan1993423 + 4 + 4 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 14:35:27 | 显示全部楼层

给几个测试用例。

输入:xxx
输出:xxx
解释:xxx(可选)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 14:50:55 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-2-6 17:36 编辑

import math
def func325(n):
    m=round(n/math.e,0)
    return '%.2f' % (n/2.0)**2 if m<=2 else '%.2f' % (n/m)**m
print(func325(10))

推导过程

推导过程

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
fan1993423 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 14:54:05 | 显示全部楼层
楼主,加一个条件吧,拆成若干个正数之和,,不然1=-2+-2+5,这样的下去就无解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 16:46:39 | 显示全部楼层
本帖最后由 William4869 于 2020-2-6 23:38 编辑

证明:
已知对任意X,分成给定K个数之和求乘积,当且仅当取N等分时乘积最大(平均值不等式)
x1x2x3....xK<((x1+x2+x3...+xK)/K)^K

所以最佳拆法分必然是等分

于是题目转换成,给定X
求f(n)=(X/n)^n的最大值

取对数求导d(lnf(n))/dn=lnX-lnn-1=ln(x/ne)

所以当n取x/e时f(n)最大,且向两边递减
又n只能取整数
所以n=x/e向上或向下取整即为所求

而当x<2e时,上述可能不适用
因为此时x/e向下或向上取整,可能不拆分变成1*x最大(在x<4时开始体现)与题意就有了出入,当成特例处理一下就行

权限不够,不好上传图片,手打可累了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 16:53:14 From FishC Mobile | 显示全部楼层
1可以拆分成正无穷大  +负无穷小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 17:11:52 | 显示全部楼层
本帖最后由 kinkon 于 2020-2-6 23:48 编辑
def f325(n):
    t,num=2,0
    while t/1000<=n:
        num=max(num,((n/t)**t))
        t+=1
    return round(num,2)

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +1 收起 理由
fan1993423 + 3 + 3 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 19:53:53 | 显示全部楼层
本帖最后由 kinkon 于 2020-2-6 23:47 编辑

酱紫应该会快点
def f325(n):
    t,num=2,0
    while t/1000<=n:
        s=round((n/t)**t,2)
        if s<num:break
        else:
            sum=s
            t+=1
    return num
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 19:56:04 | 显示全部楼层
根据均值定理:a+b/2 >= sqrt(ab) 这个sqrt相当于根号,两边相等当且仅当 a == b
又因为取得最大值可以分解为小数,那么e就是最合适的,所以给定任意一个数,分解的数字的平均值越接近 e 乘积的结果也就最大
例如 5 最大值就是6.25 也就是平分,而其他的数字,应该分成尽量多的e,若余下的数字为 n,e 有 x 个 ,那么分割的数字就是 e + n/x
不知道解释的完不完整,大家有新的想法,可以回复哦,一起探讨一下,嘿嘿,
我说完这些,其实代码也就出来了,嘿嘿

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
fan1993423 + 3 + 3 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 21:57:20 | 显示全部楼层
wp231957 发表于 2020-2-6 16:53
1可以拆分成正无穷大  +负无穷小

不能,无穷大不能计算,负无穷小是-0.000000000000000000000000000(此处省略无数个0)1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 22:20:32 | 显示全部楼层
William4869 发表于 2020-2-6 16:46
证明:
已知对任意X,分成给定K个数之和求乘积,当且仅当取N等分时乘积最大(平均值不等式)
x1x2x3....xK

对,我之前就想到了,我就是想一个划分点的问题,因为一阶导数是(x/n)**n*(ln(x/n)-1),由于指数函数肯定为正,于是就是ln((x/n)-1),显然n<x/e时单增,n=x/e极大,n>x/e单减,二阶导数为-1/n小于0,也提示一阶导数的值为极大值。但是全局没有第二个极值点,所以极值点就是最值点。但是你说x/e**2不适用,比如9大于e**2,9/e=3.3,向下取整为3,分成e,e,9-2e反而没有3,3,3更大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 22:21:03 | 显示全部楼层
ouyunfu 发表于 2020-2-6 14:50
import math
def func325(n):
    m=round(n/math.e,0)

m<=2的原理是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 22:22:07 | 显示全部楼层
题目已改成正数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 22:26:01 | 显示全部楼层

sum是内置函数,最好别这样用,另外t/1000,比方说n=10,按照你这个方法,会循环9998次,应该速度不快,这道题不需要循环吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-6 22:26:57 | 显示全部楼层
William4869 发表于 2020-2-6 14:54
楼主,加一个条件吧,拆成若干个正数之和,,不然1=-2+-2+5,这样的下去就无解了

已改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 10:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表