题目翻译:
给定长度为n的数列整数a0,a1,a2,a3 ….. an-1以及整数S。求出综合不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。
限制条件:
10 < n < 10^5
0 < ai < 10^4
S < 10^8
这里我们拿第一组测试数据举例子,即 n=10, S = 15, a = {5,1,3,5,10,7,4,9,2,8}
这幅图便是尺取法怎么“取”的过程了。
整个过程分为4布:
1.初始化左右端点
2.不断扩大右端点,直到满足条件
3.如果第二步中无法满足条件,则终止,否则更新结果
4.将左端点扩大1,然后回到第二步
用尺取法来优化,使复杂度降为了O(n)。
最后,再给一个尺取法的定义以便更好理解:返回的推进区间开头和结尾,求满足条件的最小区间的方法称为尺取法。
以上为网上关于尺取法的原理介绍,还是比较好理解的,邢如蚯蚓的爬动。
void worm_solve()
{
int res=MAX;
int s=0,t=0,sum=0;
for(;;)
{
while(t<n && sum < S){
sum+=a[t++];
}
if(sum<S) break;
res=min(res,t-s);
sum-=a[s++];
}
if(res>n)
{
res=0;
}
printf("%d\n",res);
}