版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/violinlove/article/details/83111687
传送门:http://poj.org/problem?id=3061
解析
就是尺取法的一般性题目了
设置l,r两个指针,遇到合法区间就停下来记录答案,并且l++,如果当前区间不合法(sum[ l~r ] < S)就 r++,直到合法为止
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define LL long long
#define N 100006
using namespace std;
inline int wread(){
char c(getchar ());int wans(0),flag(1);
while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
void init (){
freopen (" ","r",stdin);
freopen (" ","w",stdout);
}
int T;
int n,m;
int a[N];
LL sum[N];
int main (){
// init ();
T=wread();
while (T--){
n=wread();m=wread();
for (int i(1);i<=n;++i)
a[i]=wread(),sum[i]=sum[i-1]+(LL)a[i];
int l(1),r(1),ans(0x7f7f7f7f);
while (r<=n){
while (sum[r]-sum[l-1]<m && r<=n) r++;
if (r>n) break;
ans=min (ans,r-l+1);
if (ans==1) break;
l++;
}
if(ans==0x7f7f7f7f) puts("0") ;
else printf("%d\n",ans);
}
return 0;
}