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