本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
学而思编程:截断数组
【题目描述】
给定一个长度为n nn的数组a 1 , a 2 , . . . , a n a_1,a_2,...,a_na1,a2,...,an。
现在,要将该数组从中间某处截断,得到两个非空子数组。
要求,第一个子数组内各元素之和等于第二个子数组内各元素之和。
请问,共有多少种不同的截断方法?
【输入】
第一行包含整数n nn。
第二行包含n nn个整数a 1 , a 2 , . . . , a n a_1,a_2,...,a_na1,a2,...,an。
【输出】
输出一个整数,表示截断方法数量。
【输入样例】
3 1 1 1【输出样例】
0【算法标签】
#模拟
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;intn,a[100005],sum[100005],ans;intmain(){cin>>n;// 输入数组长度for(inti=1;i<=n;i++)// 输入数组元素{cin>>a[i];sum[i]=sum[i-1]+a[i];// 计算前缀和}// 遍历所有分割点i,检查是否可以将数组分成和相等的两部分for(inti=1;i<=n-1;i++)// i从1到n-1{intsuml=sum[i];// 左边部分的和:a[1]到a[i]intsumr=sum[n]-sum[i];// 右边部分的和:a[i+1]到a[n]if(suml==sumr)// 如果左右两部分和相等{ans++;// 计数加1}}cout<<ans<<endl;// 输出分割点数量return0;}【运行结果】
3 1 1 1 0