前缀和
1.前缀和的题目,先求出其前缀和,然后定义两个边界依次遍历
2.如果某段区间大于目标值,那么我们就缩小区间,否则就扩大区间,在遍历的同时,求出对应的符合目标值的ans值,当遍历完成之后,所得到的ans就是答案啦
3.首先初始化ans的值,如果ans的从始至终都没有改变那么就输出0,因为不存在满足题目要求的区间
4.poj不支持万能头文件,所以老老实实多谢几个头文件吧
#include <iostream> #include <cstdio> #include <algorithm> #define ll long long using namespace std; const int maxn = 1e6 + 10; int a[maxn], b[maxn], vis[maxn]; int main() { int t, n, s, ans; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &s); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); b[i] = b[i - 1] + a[i]; } int l = 1, r = 1, ans = n + 1; while (r <= n) { if (b[r] - b[l - 1] >= s) { ans = min((r - l + 1), ans); l++; } else r++; } if (ans == n + 1) printf("0\n"); else printf("%d\n", ans); } }