一开始低估这道题了,毕竟是难度0星的题(狗头
没想到还是遇到了一点点小障碍

本题主要思想是尺取法(又称双指针/追逐法),就是先考虑一个右指针向右移动,当移动到第一个满足条件的值时停下,开始移动左指针,直到左指针移动到第一个不满足条件的值时停下,继续移动右指针······ 循环过程中不断更新记录满足条件的最小距离。

本题主要要注意每次循环前清零,和当s足够大时输出为零应单独考虑两点。

代码:
#include< iostream>
#include<string.h>
using namespace std;
int a[100010]={0};
int main()
{
int m,i,n,s,k,l,j,h,p;
cin>>m;
for (i=1;i<=m;i++)
{
memset(a,0,sizeof(a));
cin>>n>>s;
for (j=1;j<=n;j++)
cin>>a[j];
k=1;
l=n+1;
h=0;
for (j=1;j<=n;j++)
{
h=h+a[j];
if (h>=s) {
l=min(j-k+1,l);
for (p=k;p<=j;p++)
{
h=h-a[p];
if (h>=s)
l=min(j-p,l);
else {
k=p+1;
break;
}
}
}
}
if (l==(n+1))
cout<<"0"<<endl;
else
cout<<l<<endl;
}
return 0;
}