尺取法通常试用于选取区间有一定规律,或所选取的区间有一定的变化趋势的情况。
POJ3061
题意:给定一个序列,找出最短的子序列长度,使得其和大于或等于S;
输入
包含两个数,一个为序列长度N,一个为S
样例输入
10 15
5 1 3 5 10 7 4 9 2 8
样例输出
2
思路:
①当一个区间的和大于等于S,则不需要再向后推进右端点,因为其和必定大于S并且长度更长 。因此,当区间和小于S时右端点向右移动,和大于等于S时,左端点继续向右移动找到最短的区间;
②为了能更快速的判断子序列的和的值,可进行前缀和预处理;
int len=10,i; /*令N为10*/
int s=0,t=0,sum=0,a[10],S,N;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
scanf("%d %d",&S,&N);
while(1)
{
while(t<N&&sum<S)
sum+=a[t++];
if(sum<S)
break;
len=len>(t-s)?(t-s):len;
sum-=a[s++];
}
if(len>N)
len=0;
printf("%d\n",len);