![](https://img-blog.csdnimg.cn/img_convert/8138126b006c77d2809577b6f2f58122.png)
输入1:
4
1 2 3 3
输出1:
1
输入2:
5
1 2 3 4 5
输出2:
0
输入3:
2
0 0
输出3:
0
题意:将一个数组分割成三个非空数组并且三个数组的和相等,问数组的分割方法有多少种.
思路:首先要明确的是只有当数组之和除三除得尽的时候,才有答案,并且数组存在负数,所以答案可能不止一个.
每个分割出来的数组的和都是数组总和sum的三分之一,设置一个cnt来表示到某个位置时,sum / 3的情况有多少种
当数组的前缀和 = sum / 3 时,将cnt加一.
当数组的前缀和 = 2 * sum / 3 时,代表后面的数的和是sum / 3,这个时候分割的方法可以加上在这个位置之前前缀和为sum / 3的情况.
注意循环的边界,i到n的时候,后面已经没有数.
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int a[N], b[N];
int32_t main(){
int tt = 1;
// cin >> tt;
while(tt--){
int n; cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
b[i] = b[i - 1] + a[i];
}
if(b[n] % 3 || n < 3) printf("0\n");
else{
int avr = b[n] / 3, d = 0, ans = 0;
for(int i = 1; i < n; i++){
if(b[i] == 2 * avr) ans += d;
if(b[i] == avr) d++;
}
printf("%lld\n", ans);
}
}
}