A-尺取
题目描述
给一串序列,求其中一段满足各元素的总和大于等于数S的连续子序列的最短长度。
题目分析
因为 专题名字是尺取 要求满足条件的连续子序列的最短长度,由缩短长度的过程可联想到使用尺取法。
注意是大于等于而不是只有等于。
注意边界的处理以免答案差1。
代码
#include <stdio.h>
int main()
{
int ca;
scanf("%d",&ca);
while(ca--){
int n,a[100000],aim,i,ans=0,left=0,sum=0;
scanf("%d%d",&n,&aim);
for(i=0;i<n;i++)
scanf("%d",a+i);
for(i=0;i<n;i++){
sum+=a[i];
while(sum>=aim){
sum-=a[left++];
if(sum<aim)
ans=ans?(ans<(i-left+2)?ans:(i-left+2)):(i-left+2);
//减left的时候减多了1
}
}
printf("%d\n",ans);
}
}