我一开始有疑问,明明数组的总数s已经确定,那么为什么对一刀可以有多个位置呢,不应该都是在s/3的位置吗
确实,无论如何切的位置必须保证值为s/3,开始可能有切的位置不同,但是值相同的情况
例如 1 2 0 0 3 3 可以切成12 003 3 也可以 120 03 3 也可以1200 3 3
所以可能出现位置不同值相同的情况,出现这种情况必定是因为有0来站位置,但是不占总和
因为如果不是出现0的话,便没有办法下一个位置的值加上之后仍然保持前i个数的值还是s/3了
那么我们只需要找第一个刀口,只要值为s/3便都可以做为第一个刀口,cnt便一直加到值不等于s/3为止
此时的cnt数便是第一个刀口可以切的全部方法,后续第二个刀口每个不同的刀口都要加上第一个刀口全部的可能,构成全部切法的可能
每有一种第二个刀口的切法,便有第一个刀口全部的切法,于是res+=cnt,最终res构成全部的切法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
int n;
int a[N],s[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
s[i]=s[i-1]+a[i];
}
if(s[n]%3!=0) cout<<"0";
else
{
ll res=0,cnt=0;
for(int j=2;j<n;j++)
{
if(s[j-1]==s[n]/3) cnt++;
if(s[j]==s[n]/3*2) res+=cnt;
}
printf("%lld",res);
}
}
新手思路,不对请帮忙纠正