由于是英文题面的缘故,讲下题意。
大概就是给一个有\(N\)个正整数的序列,求出最小的子串长度,其和大于\(S\)。
去学了下所谓的"尺取法"
先维护一下左右两个指针,当当前总和小于\(S\)时,需要推进右指针来使总和变大,当总和大于等于\(S\)的时候,需要推进左指针来使得答案满足要求/答案更优。
#include <iostream>
#include <cstdio>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int max_n = 1e5 + 5;
int T, N, M, L, R, Ans;
int A[max_n];
inline int read()
{
register int x = 0;
register char ch = getchar();
while(!isdigit(ch))
ch = getchar();
while(isdigit(ch))
{
x = (x << 1) + (x << 3) + ch - ‘0‘;
ch = getchar();
}
return x;
}
int main()
{
int l, r;
ll sum;
T = read();
while(T--)
{
N = read(), M = read();
Ans = inf, l = r = 1, sum = 0;
for(int i = 1; i <= N; ++i)
A[i] = read();
while(1)
{
while(r <= N && sum < M) sum += A[r++];
if(sum < M) break;
Ans = std::min(Ans, r - l);
sum -= A[l++];
}
printf("%d\n", (Ans == inf) ? 0 : Ans);
}
return 0;
}