tips:
1.根据实际情况交替推进两个端点得到答案的过程
2.左端点先动,右端点后动
3.还有一个nlogn的写法,前缀和+二分。
//这个尺取法真是巧妙,特别是循环 //里面两个条件 一个控制左端点,一个控制右端点 //只有当sum < S 时才进入循环,这时才改变右端点 //未进入循环前,左端点一直在后移。 //还有求区间【s,t】长度本来是 t-s+1;这里先让t在循环里自增 //出循环后直接减 #include<cstdio> #include<algorithm> using namespace std; const int MAXN=100001; int num; int N,S; int a[MAXN]; int main(){ scanf("%d",&num); while(num--){ scanf("%d%d",&N,&S); for(int i=0; i < N; i++){ scanf("%d",&a[i]); } int ans=N+1; int t=0,s=0,sum=0; for(;;){ while(t < N && sum < S){ sum+=a[t++]; } if(sum < S) break; ans=min(ans,t-s); sum-=a[s++]; } if(ans > N){ ans=0; } printf("%d\n",ans); } return 0; }