Date:January 30th Title: 集训Day3-合格的区间 题解

时间:2s 空间:256M

题目描述:

小信毕业后在电子厂打工。现在在他前面一次摆放了n个产品,每个产品都有一个综合跑分值,表示为数组a。如果对于区间(l,r),里面的产品的综合跑分值最大值为x,最小值为y,则称这个区间为合格的。请你帮帮小信计算共有多少个合格的区间。

输入格式:

第一行包含三个整数 n,x,y,表示产品的个数和综合跑分值的上下限。

第二行包含n个整数a1,a2,...,an,表示每个产品的总和跑分值 。

输出格式:

输出一个整数表示答案。

样例1输入:

4 3 1

1 2 3 1

样例1输出:

4

样例2输入:

5 2 1

1 3 2 4 1

样例2输出:

0

约定:

对于100%的数据,1≤n≤2×1051≤ai≤2×1051≤y≤x≤2×105

题意:

有n个产品,有综合跑分值数组a。区间(l,r)中的产品跑分值平均值在y~x之间,则这个区间为合格的,求共有多少个合格的区间。

分析:

这是一道双指针,一般来说对于符合一定条件的不固定区间一般来说都是双指针,先扩展右指针,然后将不符合条件的左指针缩进。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[1010][2510];
int n,m,w,ans,mod=998244353;
int dp(int x,int now)
{
    if(now>w)return 0;
    if(x>n)
    {
        if(now<=w)return 1;
    }
    if(f[x][now]!=-1)return f[x][now];
    int res=0;
    for(int i=1;i<=min(m,w-now);i++)
    {
        res+=dp(x+1,now+i);
        res%=mod;
    }
    return f[x][now]=res%mod;
    
}
signed main()
{
    memset(f,-1,sizeof(f));
    cin>>n>>m>>w;
    cout<<dp(1,0);
}

The End

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值