题目: 小b有一个01序列A,她想知道A有多少个非空连续子序列和为S。
你能帮帮她吗?
输入 第一行输入一个数n,表示A的长度; 第二行输入n个数‘0’或‘1’,表示A中的元素,以空格隔开; 第三行输入一个非负整数S; 其中0≤S≤n≤30000。
输出 输出一个数,表示子数组的个数 输入样例 5 1 0 1 0 1 2 解法: 统计每个1之前0的个数即可,然后组合计算一下乘积,注意处理S为0的情况。 代码:
using namespace std;
int sum[30010];
int main()
{
int n;
scanf("%d", &n);
int now = 0;
int l = 0;
for(int i = 0;i < n; i++)
{
int s;
scanf("%d", &s);
if(s == 0){
now++;
}
else{
sum[l++] = now;
now = 0;
}
}
sum[l] = now;
int s;
scanf("%d", &s);
long long ans = 0;
if(s > 0){
for(int i = 0; i + s <= l; i++)
{
ans += (sum[i] + 1) * (sum[i + s] + 1);
}
}
else{
for(int i = 0; i <= l; i++){
//printf("%d\n", sum[i]);
ans += sum[i] *(sum[i] + 1)/2;
}
}
printf("%lld", ans);
return 0;
}