题解 | #Subsequence#
Subsequence
https://ac.nowcoder.com/acm/problem/107658
题目大意:有T组测试,每一组有N个数字,并且最大和为K。我们要求这N个数字中连续和大于等于K的最小区间长度。
思路:因为是求和,所以我们可以先求一个前缀和数组来保存从0 - a[i]的所有和,并且每一个区间都可以用两者端点求出来。然后通过边界条件,也就是右边不超出数组的长度,然后判断l-r区间和是否满足要求,如果满足,那么我们的左边界就可以右移,因为刚开始的左右边界都是从1开始的,所以右边界一但往左走就不会满足条件了。期间不断更新最小值就可以了。
//代码:
int main() {
IOS;
int t;
int n, k;
cin >> t;
while (t--) {
cin >> n >> k;
int l = 1, r = 1;
int sum = 0x7fffffff; //因为是求最小值,所以需要把sum定义的尽可能的大
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = b[i - 1] + a[i]; //前缀和数组
}
while (r <= n) {
if (b[r] - b[l - 1] >= k) { //前缀和数组端点相减获得区间和
sum = min(sum, r - l + 1); //更新区间长度
l++; //左边界右移
} else r++; // 不满足就扩大区间
}
if (sum == 0x7fffffff)
cout << 0 << endl;
else
cout << sum << endl;
}
return 0;
}
阿里云成长空间 763人发布