题目描述
C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?
输入描述:
第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9)
输出描述:
一行输出答案。
示例1
输入
3 100 2
1 2 3
输出
2
//递归解法
int f(int now,int s,int c,int v,int t,int *A,int n){
if(s==c&&v<t)
return 1;
if(s>c||v>=t)
return 0;
int k = 0,l = 0;
if(now+s<n)
k =k + f(now,s+1,c,v+A[now+s],t,A,n);
if(now+1<n&&s==1)
l =l + f(now+1,1,c,A[now+1],t,A,n);
return k+l;
}
//转dp
#include <stdio.h>
long long int dp[200002];
int A[200002];
int main() {
int n,t,c;
while(scanf("%d %d %d",&n, &t,&c) != EOF){
for(int i=1;i<=n;++i){
scanf("%d",&A[i]);
}
dp[1]=A[1];
for(int i=2;i<=n;++i)
dp[i]+=dp[i-1];
int s=0;
for(int i=1;i<=n-c+1;++i){
s+=(dp[i+c-1]-dp[i-1])<t ? 1:0;
}
printf("%d\n",s);
}
return 0;
}