目录
题目大意
题目描述
已知有n个动物朋友排成一排,每个动物朋友都有一个正整数的快乐值,涛涛每次会和连续的动物朋友玩,并且获得这些动物朋友快乐值的和的快乐,而涛涛是个完美主义者,他觉得快乐值刚好是m时候才是快乐的,现在请问有多少种选择方式,使得所选的连续的动物朋友的快乐值刚好为m。
输入描述:
第一行输入n(1<=n<=1e6)和m(1<=m<=1e6)。
第二行输入n个正整数,第i个代表第i个动物朋友的快乐值。(1<=ai<=1e5)
输出描述:
一个整数,表示可能存在的选法数量,如果没有,就输出0;
考察知识点
双指针和前缀和
解题思路
定义一个双指针 l ,r ,利用前缀和来求,当r<=n时,循环操作,直到r>n时停止循环,得出ans的值即是连续子段和等于m的个数
实现代码及注释
#include<iostream>
int a[1000006];
long long sum[1000006];
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[0]=0;
sum[i]=sum[i-1]+a[i];
}
int l=0,r=1;//定义双指针
int ans=0;
while(r<=n) //当右指针不超过边界时循环操作
{
if(sum[r]-sum[l]<m)//如果该子段和小于m时
{
r++; //右指针右移
}
else if(sum[r]-sum[l]>m) //如果该子段和大于m时
{
l++; //左指针右移
}
else //否则即子段和等于m时
{
ans++; //选法数加一
r++; //右指针右移
}
}
cout<<ans<<endl;
}