试用一下尺取法的另一种表现形式
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int MAX_N = 100010;
int a[MAX_N];
int main(void)
{
int t, n, m, i;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int res = INF;
int s, t, sum;
s = 0;
t = 0;
sum = 0;
//利用循环使得SUM得以遍历所有满足题意的情况
while(1)
{
while((t < n) && (sum < m))
{
sum = sum + a[t];//当得到一个满足题意的SUM就跳出循环此时序列S~T
t++;//T表示毛毛虫头部,表示其前进状态
}
if(sum < m)//如果前面跳出循环的原因是因为T>=N,那么说明此情况下无解
{
break;
}
res = min(res, t-s);//如果程序运行到这一步那么说明S~T序列是一个解
sum = sum - a[s];//毛毛虫的尾巴前移位
s++;//为下一次移位做准备
}
if(res == INF)
{
res = 0;
}
printf("%d\n", res);
}
return 0;
}