说明
尺取顾名思义就是像尺子一样取数据,用到尺取的题目都是连续有规律的数据。假如要你从几个数据中求出他规定个数数据的最大值。当你不知道尺取如何用时,平常应该是起点在第一个,然后取出规定个数的数据,把数据存下,以便更新最大值,然后下一次起点后移一个,就这样反复可以求得最大值。但是在数据很多的情况下这样反复,时间复杂度会很高,在遇到难题时用普通方法是几乎不能实现的,所以我们要学会用尺取。
题目详解
1、 Poj3061
题意:给定一个序列,找出最短的子序列长度,使得其和大于或等于S。
代码如下:
#include <stdio.h>
main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a[100000]={0},N,S,i;
int L,R,sum,d=100001;//L是左边下标,R是右边下标,d为符合序列的长度
scanf("%d%d",&N,&S);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
sum=L=R=0;
while(1)
{
while(sum<S&&R<N)//右下标要在范围内,sum为序列的和
sum+=a[R++];
if(sum<S)//没有符合的序列就退出
break;
d=d<(R-L)?d:(R-L);//R-L是每次满足的序列长度
sum-=a[L++];//减去左下标看看后面有没有符合条件更短的序列
}
if(d>N)
d=0;
printf("%d\n",d);
}
}