根据题解自己明白的一些思路,小菜鸡的自我修养中。
典型的前缀和问题,有点类似于线段的一个问题。
大体思路其实就是:
- 考虑条件:(不成立)不能被平等的分成三段 或者是 n<3
- 算出给出序列之和的1/3
- 进行设想:summ2*average(就是目前已经是2/3了,那么她就将前面是1/3的加上,就是一个累加的过程)summ2*average(如果算出目前累加的已经是1/3了,那么就可以直接划一刀)
为什么不能调换顺序呢?
在这个序列中,总共平等的分成三段。
最多其实只能划上两刀,所以如果出现
序列1已经等于1/3 且 序列1+序列2等于2/3的话 那么这个序列必定可以分成三个相等的序列。是不需要考虑到序列3了
所以答案只能是 0 1 2
同时需要考虑到一些数值的范围 题目是要求在10e+5;
所以的话 为了前缀和的话 还是定义为long long 更为保险。
#include<iostream>
using namespace std;
const int N=1000005;
int main()
{
long long int n;
cin>>n;
long long int a[N];
long long int ans=0;
long long int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
if(sum%3||n<3)cout<<"0";
else
{
long long int summ=0;
long long int js=0;
long long int average=sum/3;
for(int i=0;i<n-1;i++)
{
summ+=a[i];
if(summ==2*average)ans+=js;
if(summ==average)++js;
}
cout<<ans;
}
} ```
可以与前缀和综合一下。