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; }
标签:int,3956,long,截断,数组,AcWing From: https://www.cnblogs.com/shinnyblue/p/17148041.html