动物朋友(前缀和--双指针)

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

题目描述: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值