这道题虽然水,但是本人第一次做时就错了😂
先上题:
题目描述:
小b(我真的恨她) 有一个01序列A,她想知道A有多少个非空连续子序列和为S。你能帮帮她吗?(真相说不能)
输入
第一行输入一个数n,表示A的长度;
第二行输入n个数‘0’或‘1’,表示A中的元素,以空格隔开;
第三行输入一个非负整数S;
其中0≤S≤n≤30000。
(注意复杂度)
输出
输出一个数,表示子数组的个数
输入样例
5
1 0 1 0 1
2
输出样例
4
先来说思路:
接着,到核心代码:
分析核心代码:
这里面,我们运用了前缀和的思想,当v > s的时候,此时不需要再循环下去了,因为不可能再找到<=s的非空连续子序列了,所以直接break掉,v存的是非空连续子序列各个数的和
**
好了,废话够多了,上点正经的,来全代码咯:
**
#include<bits/stdc++.h>
using namespace std;
long long n,sum;
int a[30005];
int s;
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
cin >> a[i];
cin >> s;
for(int i = 1;i <= n;i++)
{
int v = 0;
for(int j = i;j <= n;j++)
{
if(v > s)
break;
v += a[j];
if(v == s)
sum++;
}
}
cout << sum << endl;
return 0;
}