题解 | #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; }