截断数组原题链接
给定一个长度为 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
对y总的方法进行解析
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
int a[N],s[N];
typedef long long ll;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]=s[i-1]+s[i];//前缀和处理
}
if(s[n]%3)
{
cout<<"0";
return 0;//因为要把数组均分三份,总和一定得是3的倍数
}
ll res=0;//注意范围
for(int i=3,cnt=0;i<=n;i++)
{
if(s[i-2]==s[n]/3) cnt++;//因为是要非空子数集,所以假设第一刀落刀处为j,1<=j<=i-2,这里相当于判断第一段
if(s[n]-s[i-1]==s[n]/3)//i-1是第二刀落刀处,这里就相当于判断最后一段
res+=cnt;//最后两次个数合并,三段只要砍两刀
}
cout<<res<<endl;
return 0;
}