题目大意:从给定序列里找出区间和大于等于S的最小区间的长度。
前阵子在zzuli OJ上见过类似的题,还好当时补题了。尺取法O(n)
的复杂度过掉的。尺取法:从头遍历,如果不满足条件,则将尺子尾
部增加,若满足条件,则逐渐减少尺子头部直到不满足条件为止,保存
尺子长度的最小值(尾部-头部+1)即可。
理论上累计区间和+二分查找的暴力也能过。
代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define oo 0x3f3f3f3f
int n, nums[], S;
int LIS()
{
int l = , r;
int ans = oo;
int sum = ;
for(int i=; i<=n; i++)
{
sum += nums[i];
r = i;
while(sum>=S)
{
ans = min(ans, r-l+);
sum-=nums[l];
l++;
}
}
return ans;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &S);
for(int i=; i<=n; i++)
scanf("%d", &nums[i]);
int ans = LIS();
if(ans==oo)printf("0\n");
else printf("%d\n", ans);
}
return ;
}