截断数组(蓝桥杯每日一题)

简介: 截断数组(蓝桥杯每日一题)

截断数组(蓝桥杯每日一题)

给定一个长度为 n的数组 a1,a2,…,an。

现在,要将该数组从中间截断,得到三个非空子数组。

要求,三个子数组内各元素之和都相等。

请问,共有多少种不同的截断方法?

输入格式

第一行包含整数 n。

第二行包含 n个整数 a1,a2,…,an。

输出格式

输出一个整数,表示截断方法数量。

数据范围

前六个测试点满足 1≤n≤10。

所有测试点满足 1≤n≤105,−10000≤ai≤10000。

输入样例1:

4

1 2 3 3

输出样例1:

1

输入样例2:

5

1 2 3 4 5

输出样例2:

0

输入样例3:

2

0 0

输出样例3:

0

算法思路

这是一个前缀和的应用,如果这个数组可以分割,那么代表这个数组的总和对三取余为0。

然后如何统计分割次数了,在可以分的前提下,如果当前的数的前缀和是总和的1/3的时候,代表的是这个可以分割了,后面的那1/3就是固定的了,那么结果就可以加上了,如果当前数的前缀和是总和的1/3,那么代表这是一个新的方式,那么当前可以加的tmp就需要+1。

C++版本

#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e5 + 10;
int num[N];
long long sum;
int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++ i)
    {
        cin >> num[i];
        sum += num[i];
    }
    if(sum % 3 != 0) cout << "0";
    else 
    {
        long long ave = sum / 3;
        long long nowSum = 0, tmp = 0;
        long long ans = 0;
        for (int i = 1; i < n; ++ i)
        {
            nowSum += num[i];
            if (nowSum == 2 * ave) ans += tmp;
            if (nowSum == ave) ++ tmp;
        }
        cout << ans << endl;
    }
    return 0;
}

Java版本

import java.util.*;
public class Main{
    static int N = 100010;
    static int n, m;
    static long res;
    static int[] a = new int[N];
    static int[] s = new int[N];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        for (int i = 1; i <= n; i ++) a[i] = scan.nextInt();
        for (int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i];
        if (s[n] % 3 != 0 || n < 3)
        {
            System.out.println(0);
            return;
        }
        int dex = s[n] / 3;
        for (int i = 1; i < n; i ++)
        {
            if (s[i] == dex * 2) res += m;
            if (s[i] == dex) ++ m;
        }
        System.out.println(res);
    }
}


相关文章
|
7月前
|
机器学习/深度学习 Java BI
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-970 数组移动
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-970 数组移动
59 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-49 算法训练 寻找数组中最大值
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-49 算法训练 寻找数组中最大值
57 0
|
6月前
蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组
蓝桥杯动态规划-第五弹 最大子数组和 买卖股票最佳时机IV 第N个泰波那契数 环形数组
|
6月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组G题 数组切分
2022蓝桥杯大赛软件类省赛Java大学B组G题 数组切分
32 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-493 合并排序数组
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-493 合并排序数组
49 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-79 删除数组零元素
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-79 删除数组零元素
40 0
|
7月前
|
存储 Java 索引
第十四届蓝桥杯集训——数组(一维)
第十四届蓝桥杯集训——数组(一维)
79 0
|
7月前
|
人工智能 算法 Java
数组元素的目标和(蓝桥杯每日一题)
数组元素的目标和(蓝桥杯每日一题)
44 0
|
7月前
蓝桥杯vip测试题系统-数组求和(解题思路以及解题代码,手画思路图虽然丑丑的)
蓝桥杯vip测试题系统-数组求和(解题思路以及解题代码,手画思路图虽然丑丑的)
58 0
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
111 0