题解 | 喜欢切数组的红

喜欢切数组的红

https://www.nowcoder.com/practice/74cb703f25dc4956acb3b08028a1f4b4

def solve():
    # 读取输入
    n = int(input())
    arr = list(map(int, input().split()))

    # 如果数组长度小于3,无法分成3部分,直接输出0
    if n < 3:
        print(0)
        return

    # 计算数组总和
    total_sum = sum(arr)

    # 如果总和不能被3整除,无法分成3个和相等的子数组,直接输出0
    if total_sum % 3 != 0:
        print(0)
        return

    # 计算每个子数组的目标和
    target = total_sum // 3

    # 计算前缀和数组,prefix_sum[i]表示前i个元素的和
    prefix_sum = [0] * (n + 1)
    for i in range(1, n + 1):
        prefix_sum[i] = prefix_sum[i - 1] + arr[i - 1]

    # 计算前缀正数个数数组,prefix_positive[i]表示前i个元素中正数的个数
    prefix_positive = [0] * (n + 1)
    for i in range(1, n + 1):
        prefix_positive[i] = prefix_positive[i - 1] + (1 if arr[i - 1] > 0 else 0)

    # 寻找所有可能的第一分割点i,满足前i项和等于target且至少包含一个正数
    candidates_i = []
    for i in range(1, n - 1):  # i最多到n-2,确保后面至少有两个元素
        if prefix_sum[i] == target and prefix_positive[i] >= 1:
            candidates_i.append(i)

    # 寻找所有可能的第二分割点j,满足前j项和等于2*target且第三部分至少包含一个正数
    candidates_j = []
    for j in range(2, n):  # j最多到n-1,确保第三部分至少有一个元素
        if (
            prefix_sum[j] == 2 * target
            and (prefix_positive[n] - prefix_positive[j]) >= 1
        ):
            candidates_j.append(j)

    # 统计满足条件的分割方案数
    count = 0
    for j in candidates_j:
        # 遍历所有i < j的候选分割点i,确保中间部分至少有一个正数
        for i in candidates_i:
            if i >= j:
                continue  # 确保i < j
            if prefix_positive[j] - prefix_positive[i] >= 1:
                count += 1

    print(count)


solve()

全部评论

相关推荐

每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务