题目描述:https://ac.nowcoder.com/acm/contest/61132/E
已知有n个动物朋友排成一排,每个动物朋友都有一个正整数的快乐值,涛涛每次会和连续的动物朋友玩,并且获得这些动物朋友快乐值的和的快乐,而涛涛是个完美主义者,他觉得快乐值刚好是m时候才是快乐的,现在请问有多少种选择方式,使得所选的连续的动物朋友的快乐值刚好为m。
输入描述:
第一行输入n(1<=n<=1e6)和m(1<=m<=1e6)。
第二行输入n个正整数,第i个代表第i个动物朋友的快乐值。(1<=ai<=1e5)
输出描述:
一个整数,表示可能存在的选法数量,如果没有,就输出0;
示例1
输入
1 5
4
输出
0
示例2
输入
11 45
1 4 1 9 19 8 10 8 1 2 3
输出
1
总结:
对于本题的数据范围1<n<1e6 要求在1s内完成其计算量为1e8
对于区间求和可以用--------------区间和
对于遍历所有区间和可以用-----双指针
代码献上(前缀和--双向指针)
#include<iostream>
using namespace std;
const int N=1e6+10;
int q[N];
int main()
{
int n,k;cin>>n>>k;
for(int a=1;a<=n;a++)
{
cin>>q[a]; //数据输入
q[a]+=q[a-1]; //求出前缀和
}
int l=0,r=1; //指针定义
int ans=0; //定义和变量
while(l<n&&r<=n) //双指针限制条件
{
if(r==l) //当r与l相等前指针后移
r++;
while((q[r]-q[l])<k&&l<n&&r<=n) //小于k 前指针后移
{
r++;
}
while((q[r]-q[l])>k&&l<n&&r<=n) //大于k 后指针后移
{
l++;
}
if((q[r]-q[l])==k) //和等于k
{
ans++; //计数器加一
l++; //后指针后移
}
}
cout<<ans; //输出奇数
return 0;
}

给定一组动物朋友的快乐值,涛涛会选择连续的一段,使得这一段的快乐值总和等于特定目标m。问题转化为寻找前缀和等于m的区间数量,使用双指针和前缀和的方法可以在限制时间内解决这个问题。代码示例展示了如何实现这个算法。
386

被折叠的 条评论
为什么被折叠?



