所谓的尺取,就是像尺子一样,在一段区域内,选取区间端点,通过控制下标的方法,一段一段的截取,
poj3061
题意:给定一个序列,找出最短的子序列长度,使其和大于或等于S
解:首先,把两个端点的下标都赋值给给定序列的左端点,然后当所选定的端点区间的和小于S并且右端点的下标小于或等于给定序列的端点下标时,把右端点向后退进,如果当右端点的下标大于了序列右端点,并且其和仍然小于S,输出0;反之,当其和大于等于S时,左端点向后移动,缩短区域,求出最短区间。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define n 101000
using namespace std;
long long a[n];
int main()
{
long long S;
int i,j,N,ans;
int t;
while(scanf("%d",&t)!=EOF){
while(t--)
{
scanf("%d%lld",&N,&S);
long long sum=0;
for(i=1;i<=N;i++)
scanf("%lld",&a[i]);
i=1;j=1;
ans=0xffff;
while(1)
{
while(j <= N && sum < S)
sum += a[j++];
if(sum < S)
break;
ans = min(ans,j-i);
sum -= a[i++];
}
if(ans==0xffff)
ans=0;
printf("%d\n",ans);
}
}
return 0;
}