1 条题解

  • 0
    @ 2025-10-27 23:09:34

    好的,这是该题的题解和算法标签。


    题目翻译

    给定一个长度为 nn 的自然数数组,将其划分为两个非空连续子数组,使得两个子数组的和的乘积最大。输出划分位置 ii(即第一个子数组的最后一个元素下标)。


    题解

    算法思路

    设数组总和为 SS,前缀和 pre[i]=a1+a2++aipre[i] = a_1 + a_2 + \dots + a_i,则切分在位置 ii 时:

    • 左部分和 = pre[i]pre[i]
    • 右部分和 = Spre[i]S - pre[i]
    • 乘积 P(i)=pre[i]×(Spre[i])P(i) = pre[i] \times (S - pre[i])

    展开: [ P(i) = S \cdot pre[i] - pre[i]^2 ] 这是关于 pre[i]pre[i] 的二次函数,开口向下,对称轴在 pre[i]=S/2pre[i] = S/2

    因此,pre[i]pre[i] 最接近 S/2S/2 时,乘积最大

    我们只需遍历 i=1n1i = 1 \dots n-1,找到使 pre[i]S/2|pre[i] - S/2| 最小的 ii 即可。


    时间复杂度

    • 计算前缀和:O(n)O(n)
    • 遍历寻找最优位置:O(n)O(n) 总复杂度 O(n)O(n),可处理 n2×105n \le 2\times 10^5

    空间复杂度

    • 只需维护前缀和与总和,O(1)O(1) 额外空间(不存整个前缀和数组也可)。

    示例

    输入:

    3
    1 2 3
    

    总和 S=6S = 6S/2=3S/2 = 3

    • i=1i=1pre[1]=1pre[1] = 1,差 13=2|1-3|=2
    • i=2i=2pre[2]=3pre[2] = 3,差 33=0|3-3|=0

    i=2i=2,输出 2


    算法标签

    • 前缀和
    • 数学优化
    • 贪心
    • 数组

    核心结论

    最大乘积出现在前缀和最接近总和一半的位置

    • 1

    信息

    ID
    4326
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者