题解 | #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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务