给定长度为 n 的数列整数a0,a1,...,an−1 以及整数 S。
求出总和不小于 S 的连续子序列的长度的最小值。如果解不存在, 则输入 0。
输入
- 本题包含多组测试数据,第一行为一个整数 T, 表示测试数据组数
- 接下来每组测试数据第一行包含两个数 n 和 S, 第二行有 n 和整数, 表示 a0,a1,...,an−1
- 10 < n < 10^5, , S < 10^8
输出
- 对于每组测试数据输出一行,输出题目要求的整数
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-03-31 11:36:17
* @LastEditTime: 2022-03-31 13:59:00
*/
#include<bits/stdc++.h>
#define Inf 0x3f3f3f
using namespace std;
const int N = 1e6 + 10;
int n, s, t;
int a[N];
int sum[N];
void add(){
for(int i = 1;i <= n;i ++)
sum[i] = sum[i - 1] + a[i];
}
int main()
{
cin >> t;
while(t--){
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
cin >> n >> s;
for(int i = 1;i <= n; i++)
cin >> a[i];
// for(int i = 1;i <= n;i ++)
// sum[i] = sum[i - 1] + a[i];
add();
if(sum[n] < s)
cout << 0 << endl;
// for(int i = 1;i <= n; i++)
// cout << sum[i] << " ";
int ans = Inf;
for(int i = 1;sum[i] + s <= sum[n];i ++){
int t = lower_bound(sum + 1,sum + 1 + n,sum[i] + s) - sum;
ans = min(ans, t - i);
}
cout << ans << endl;
}
}
2489

被折叠的 条评论
为什么被折叠?



