革命尚未成功

————同志仍需努力————

shinnyblue

导航

3956.截断数组

AcWing 3956. 截断数组(每日一题) - AcWing

做题有感...

 

 

#include<iostream>
using namespace std;
const int N = 1e5+5;
int n,s[N],temp,cnt=0;
long long ans=0;
int main()
{
    cin>>n;
    for (int i = 1; i <= n; i++)//i初始值为1而非0
    {
        scanf("%d",&temp);
        s[i]=s[i-1]+temp;
    }
    if (s[n]%3 || n < 3 ){//特判(特殊情况判断):当n小于3(第二刀无处切)或者总和不是3的倍数时,方案数为0
        puts("0");
    }
    else{
        for (int i = 2; i < n; i++)//只遍历一遍,而非双for循环(缩小时间复杂度)  |   i从2开始,范围是[2,n),换言之,第二刀的位置应该从第二棵树和第三棵树的间隙开始讨论(植树问题模型)
        {                           //i遍历的是第二刀(第二个切割点)
            if (s[i-1]==s[n]/3) //i-1是用来找第一刀的位置,累加第一刀可行的位置数
            {
                cnt++;
            }
            if (s[i]==s[n]/3*2) // i用来累计第二刀的位置数
            {
                ans+=cnt;//比如已经累计有3个可行的第一刀位置,那么每找到一个可行的第二刀位置,总方案数就是先前的方案数+可行的第一刀位置数
            }
        }
        cout<<ans;
    }
    
    return 0;
}

 

posted on 2023-02-23 15:05  ShinnyBlue  阅读(12)  评论(0编辑  收藏  举报

Live2D