思路:用户输入的数列a[n],再定义个sum[n]存储a[n]的前n项和。一开始写的代码老是超时,后来看了一下尺取法可以将时间复杂度优化到o(n),大致思想就是定义起点 l 和终点 f ,f的初始值是满足sum[i]>s的i的最小值。然后l++循环,直到sum[f]-sum[l]
#include <iostream>
using namespace std;
int a[100000];
long sum[100000];
int main() {
int c,n,l,f,m,i;
long s;
cin >> c;
sum[0] = 0;
while (c--) {
cin >> n >> s;
l = 0;
f = 0;
m = n;
for (i = 1; i <= n; i++) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
if (f == 0 && sum[i] >= s)f = i;
}
if (f == 0) {
cout << 0 << endl;
continue;
}
while (true) {
if (sum[f] - sum[l] >= s) {
if (f - l < m) m = f - l;
l++;
}
else {
if (f == n)break;
f++;
}
}
cout << m << endl;
}
return 0;
}