当前位置:首页 > 牛客 > 牛客4577题解:滑动窗口解法

牛客4577题解:滑动窗口解法

5个月前 (07-11)

牛客4577题解:滑动窗口解法 牛客题解 滑动窗口算法 前缀和 C++ 第1张

一、题目解读

牛客4577题要求处理多组测试数据,每组包含一个整数数组crimes和两个参数n(数组长度)、t(阈值)、c(窗口大小)。题目需要统计数组中所有长度恰好为c的子数组,其元素和不超过t的数量。该问题考察滑动窗口算法在子数组求和与计数中的应用,需高效处理数据以避免超时。

二、解题思路

采用滑动窗口+前缀和优化的核心思路。传统方法需遍历所有子数组计算和,时间复杂度为O(n^2)。但通过滑动窗口,可固定窗口右边界,动态调整左边界,仅用O(1)时间更新窗口和,从而将总时间复杂度降至O(n)。关键在于利用窗口的移动规律,结合“当前和-移出元素+新元素”的更新公式,避免重复计算。

三、解题步骤

1. 处理多组测试数据:通过while(cin >> n >> t >> c)循环读取每组数据,并初始化数组crimes。

2. 初始化窗口和计数器:

    定义count记录符合条件的窗口数量。

    定义window_sum初始化为前c个元素之和(即第一个窗口的和)。

    若window_sum <= t,则首个窗口符合条件,count++。

3. 滑动窗口移动逻辑,从第c个元素开始,每次右移窗口:

    更新窗口和:window_sum -= crimes[i - c] + crimes[i](减去左边界移出元素,加上新进入元素)。

    若更新后的window_sum <= t,则当前窗口符合条件,count++。

4. 输出结果:每组数据结束后输出count,换行处理下一组。

四、代码与注释

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, t, c;
    while (cin >> n >> t >> c) {  // 处理多组测试数据
        vector<int> crimes(n);
        for (int i = 0; i < n; ++i) {
            cin >> crimes[i];  // 读取每个罪犯的罪行值
        }
        int count = 0;  // 记录符合条件的窗口数量
        long long window_sum = 0;  // 当前窗口的和,使用long long防止溢出
        // 初始化第一个窗口
        for (int i = 0; i < c; ++i) {
            window_sum += crimes[i];
        }
        if (window_sum <= t) {
            count++;
        }
        // 滑动窗口:每次移动一位
        for (int i = c; i < n; ++i) {
            // 减去离开窗口的元素,加上新进入窗口的元素
            window_sum = window_sum - crimes[i - c] + crimes[i];
            if (window_sum <= t) {
                count++;
            }
        }
        cout << count << endl;
    }
    return 0;
}

五、总结

该解法通过滑动窗口技术巧妙解决子数组求和计数问题,关键在于利用窗口的动态更新机制,避免了暴力枚举的指数级时间复杂度。代码简洁高效,适用于处理大规模数据场景。此思路对理解滑动窗口算法在求和、计数类问题中的应用具有指导意义,适合算法竞赛或面试中的优化题型。


原创内容 转载请注明出处

分享给朋友:

相关文章

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

一、题目解读本题为2024年GESP四级中的“宝箱”问题(对应洛谷P4006),要求在一个由n个宝箱组成的序列中,找出一个连续子序列,使得该子序列中宝箱价值之和最大,且子序列中最大值与最小值的差不超过...

牛客14778题解析:滑动窗口算法破解字符替换问题的最优解

牛客14778题解析:滑动窗口算法破解字符替换问题的最优解

一、题目解读牛客14778题要求给定字符串s、替换次数上限m及目标字符,求解在s中通过最多m次替换操作,得到的最长连续子串长度。例如,当s="abcbab",m=2,target=...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。