You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求O(log(logX))时间复杂度算法:满足容积要求的最小橱柜花费

优化到O(log(logX))复杂度的解法

原代码的潜在问题

  1. 初始left=0不符合题目中“正整数n”的要求,会出现无效的n=0的计算。
  2. 直接用math.log(int(X),2)作为右边界,当X不是2的幂时,右边界是浮点数,二分过程中middle的计算可能存在精度误差。
  3. 直接计算2**middle会在n较大时生成极大数,占用不必要的内存和计算时间。

优化思路

橱柜容积公式为:
V(n) = 25n(n+1)×2ⁿ
该函数严格单调递增且增长速度为超指数级(核心项是2ⁿ),这意味着满足V(n)≥X的n取值范围极小。我们可以利用这个特性优化:

  1. 倍增法快速找边界:从n=1开始,不断将n翻倍,直到V(n)≥X。由于V(n)超指数增长,这个过程仅需O(log(logX))次操作(最终n达到log₂(X)量级,翻倍次数为log₂(log₂(X)))。
  2. 小范围二分查找:在倍增得到的区间(前一次的n到当前n)内进行二分,找到最小的n满足V(n)≥X,操作次数同样为O(log(logX))。

优化后的代码

import math

def min_cost(X):
    X = int(X)
    if X <= 0:
        return 0  # 题目中X应为正整数,此处处理边界情况
    
    # 倍增法确定上下界
    low = 1
    high = 1
    log_X = math.log(X)
    while True:
        # 用对数比较替代直接计算容积,避免大数运算
        log_vol = math.log(25) + math.log(high) + math.log(high + 1) + high * math.log(2)
        if log_vol >= log_X:
            break
        low = high
        high *= 2
    
    # 在缩小后的区间内二分查找最小n
    result = high
    while low <= high:
        mid = (low + high) // 2
        log_vol = math.log(25) + math.log(mid) + math.log(mid + 1) + mid * math.log(2)
        if log_vol >= log_X:
            result = mid
            high = mid - 1
        else:
            low = mid + 1
    return result

X = input("Enter a value:\n")
print(f'the min pay out is: {min_cost(X)}')

代码说明

  • 对数比较优化:将容积的乘法、幂运算转换为对数的加法运算,避免生成超大数,同时提升计算效率。
  • 倍增法缩范围:相比直接设定右边界,倍增法能快速定位到极小的有效区间,确保后续二分的操作次数被控制在O(log(logX))。
  • 修正正整数限制:从n=1开始查找,符合题目中“正整数n”的要求。

内容的提问来源于stack exchange,提问作者mewowo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:26:19