原题链接
题解
分析
- s数组为前缀和数组,这里边录入边转换
- 和能平均分为三份,意思是每一段的和都是s[n]/3
- 先判断一下是否能被整除,分成三段,不能直接输出0,否则进行操作
- 使用一层for循环进行遍历 ,用来找到两个切入点,等于一倍平均值为第一个点
等于二倍平均值为第二个点,之所以ans+=count,是因为比如前面有3个点可以切第一刀,那么后面找到第二刀时,就有三种可能性,所以要加上3
代码
#include "iostream"
#define ll long long
const int N = 100010;
int s[N]={0};
using namespace std;
int main(){
ll n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
s[i]+=s[i-1];
}
if(s[n]%3)cout<<0;
else{
ll ave = s[n] / 3;
ll count = 0;
for(int i=1;i<n;i++){
if(s[i]==ave*2)ans+=count;
if(s[i]==ave)count++;
}
cout<<ans;
}
return 0;
}
标签:int,ll,long,截断,数组,ans,acwing
From: https://www.cnblogs.com/ChengMao/p/17138512.html