原题链接:AcWing 3956 截断数组
解题思路
这里为了减少时间复杂度,采用了一个前缀和的算法套路(链接:前缀和概念及使用)
时间复杂度:O(nlogn)
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[100005]={0};
long long res=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
}
if(a[n]%3||n<2)
{
cout<<"0"<<endl;
return 0;
}
int num=a[n]/3,cnt=0;
for(int i=1;i<=n;i++)
{
if(i>=2&&i+1<=n&&a[i]==2*num)
res+=cnt;
if(i+2<=n&&a[i]==num)
cnt++;
}
cout<<res<<endl;
return 0;
}
bug
Time Limit Exceeded 没有采用前缀和的思想
WA 最后的遍历从a[0]开始,应该从a[1]开始
WA res 的数据类型应该是long long 型,否则会爆int