一:定义两个端点i,j, 初始化都从最左当开始;
二:j向右移动,i保持不动;直到i与j之间数(包括i,j)的和>=m,记录此时的区间长度
三:j停止移动,i向后移动,直至不满足条件(即i与j之间都和<m),记录i-1到j的区间长度。
四:然后j继续向后移动,i不变,重复上述步骤,直至如果j点=移动到区间末尾i~j区间的和还不大于等于m,结束区间的枚举。
五:可以用打擂台的方式找出满足条件的最小区间;
模板题:POJ3061
#include<iostream>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main()
{
int T;
int n,s,sum=0,mins,start;
cin >> T;
while(T--)
{
sum=0,mins=maxn;
cin >> n >> s;
for(int i=0; i<n; i++)
cin >> a[i];
start=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
while(sum>=s&&start<=i)
{
mins=min(mins,i-start+1);
sum-=a[start];
++start;
}
}
if(mins==maxn)
mins=0;
cout << mins << endl;
}
return 0;
}