每日一题.截断数组

先特判,显而易见数组的前缀和必须是3的倍数,要不然分不成三份。

然后就是遍历前缀和让它和1/3总和和2/3总和比,显然当第二个1/3也成立的时候就可以停止遍历,然后可以继续遍历或者退出循环得出结果。

代码如下:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll f[N],s[N];
int main()
{
  int n;
  cin>>n;
  for(int i=1;i<=n;i++) {
  cin>>f[i];
  s[i] = s[i-1] + f[i];
  }

  if(s[n]%3) {
  cout<<"0"<<endl;
  return 0;
  }

  ll le = s[n]/3;
  ll ans = 0;

  for(int i=1,j=0;i<n;i++) {
  if(s[i]==2*le) ans+=j;
  if(s[i]==le) ++j;
  }

  cout<<ans<<endl;
  return 0;
}

posted on 2023-02-14 12:37  呆唯可可爱爱  阅读(25)  评论(0)    收藏  举报

导航