滑动窗口法求解

lr580 发表于 2年前 · 关联问题 七海大鲨鱼要光盘

参赛选手未给出题解,本题解并不代表参赛选手

//本题暴力也能过(暴力是参赛选手的原解法),复杂度是 O(n\cdot n) ,具体实现略

使用栈维护一个滑动窗口,右指针每次拓展一格,若扩展后窗口总值大于 k ,则不断弹出左指针直到总值不大于 k ;若此时窗口总值大于历史值且窗口长度 \ge 2 ,记录当前窗口总值和左指针为答案。该解法复杂度为 O(n)

参考代码:

#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n, a[10010], k, ans, ansi, lf, rf, now; signed main() { scanf("%lld%lld", &n, &k); for (ll i = 1; i <= n; ++i) { scanf("%lld", a + i); } for (lf = 1, rf = 1; rf <= n; ++rf) { now += a[rf]; while (now > k) { now -= a[lf++]; } if (rf - lf >= 1 && now > ans) { ans = now, ansi = lf; } } printf("%lld\n%lld", ans, ansi); return 0; }

如有错误欢迎指正 >_<

Kami5ato Ayaka 发表于 2年前

kuzu 发表于 2年前