尺取的用途
尺取一般用来选取有一定规律的区间,对一定区间先判断是否符合条件后,再将这个区间推进。
尺取算法
尺取算法就像毛毛虫,一伸一缩的取区间,找到问题的答案。
例如:给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度
输入
n = 10,m = 15
5 1 3 5 10 7 4 9 2 8
输出
2
首先找到一个满足条件(总和不小于m)的子序列,再往后推进。
找出满足条件的长度小的子序列。
过程:
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
- 5 1 3 5 10 7 4 9 2 8
过程像一个毛毛虫爬行,通过判断是否满足条件来推进区间。
完整代码如下:
#include<stdio.h>
int main()
{
int n,m,i,j;
int a[1001];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int head=0,end=0;
int sum=0,len,min=n;
while(end<=n)
{
len=0;
sum=0;
end=head;
while(sum<m)
{
sum=sum+a[end];
end++;
len++;
}
if(len<min)
min=len;
head++;
}
printf("%d\n",min);
return 0;
}