蓝桥杯 3956. 截断数组 知识点:前缀和

130 阅读1分钟

题目:3956. 截断数组 - AcWing题库

思想来源:AcWing 3956. 截断数组 - AcWing

思想

枚举第一刀,第二刀的位置,2刀就可以把数组切成3分。

因为可以切成3份,所以数组的前缀和一定可以被3整除。

我们先把整个数组的前缀和求出来,然后/3,求出每一份的3大小t。

我们先切第一刀,确定第一刀的标准是判断第一个刀切完之后的第一个区间的前缀和是否等于t。

如果等于t那么第一刀的位置就确定了,接下来再去枚举第二刀。

第二刀切的位置的判断标准是s[n]-s[i+1],即切完第二刀之后的区间的前缀和是否等于剩下的2等份的大小的和。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int a[N],s[N];
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
    cin>>s[i];
        s[i]=s[i-1]+s[i];  //前缀和
    }
    
    LL ans=0;
    int t=s[n]/3;  //每一份都是3的倍数
    //枚举第一刀的位置
    
    
    //不能被分为3等份就输出0,结束程序
    if(s[n]%3!=0)
    {
        cout<<0<<endl;
        return 0;
    }
    LL cnt=0;
    for(int i=1;i<n-1;i++) //n-1  和 n是给后面的2等份留的
    {
        if(s[i]==t)
        {
            cnt++;  //可以切第一刀
        }
        if(s[n]-s[i+1]==t)ans+=cnt;
    }
    
    
    cout<<ans<<endl;
    
    return 0;
}