小明爱上了求和,这天他拿到一个数列和一个数字 CC,现在小明想要知道数列中连续数字和为 CC 的子数列有多少个,小明不会解决这个问题,聪明的你可以帮助小明解决这个问题吗?
输入
第一个输入一个n和c,表示数列的长度和目标值;
第二行输入n个数,表示这个数列。输出
输出一个数,表示和为c的连续子数列有多少个。数据范围
1<=n<=100000
1<=c<=1000000000
#include<bits/stdc++.h>
using namespace std;
int a[100005],w;
int main()
{
int n,c;
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++)
{
int sum=c;
sum-=a[i];
if(sum<0||sum==0) continue;
for(int j=i+1;j<=n;j++)
{
sum-=a[j];
if(sum==0)
{
w++;
break;
}
if(sum<0) break;
}
}
cout<<w<<endl;
return 0;
}
1<=数列中元素<=1000000000
输入样例
4 5
1 4 1 4
输出样例
3
样例解释
和为5的连续子数列有
1 4
4 1
1 4
#include<bits/stdc++.h>
using namespace std;
int a[100005],w;
int main()
{
int n,c;
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++)
{
int sum=c;
sum-=a[i];
if(sum<0||sum==0) continue;
for(int j=i+1;j<=n;j++)
{
sum-=a[j];
if(sum==0)
{
w++;
break;
}
if(sum<0) break;
}
}
cout<<w<<endl;
return 0;
}
这个代码为什么错了呢?
维护一个子区间和,遍历输入的数组,每次遍历到一个数就让它加入到区间和,如果加入后的区间和<c就继续遍历;如果加入后==c那么答案++;如果加入后>c那么就缩小区间和直到<=c然后按照前面方式处理。
这个连续的区间和,左右指针只会增不会减,相当于滑动窗口。
从第一个数字开始逐个向后累加
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!