解题思路:

时间复杂度

O(m * n)

m = 访问次数(操作数)n = 队列总长度(n1 + n2)


双端队列处理m次操作,每次操作最坏才O(n),操作过程按照模拟走就行。
注意事项:

参考代码:

#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;

int main() {
    int n1, n2;
    cin >> n1 >> n2;
    int m;
    cin >> m;

    deque<int> q1, q2;

    while (m--) {
        int v;
        cin >> v;

        // 判断是否在队列里
        bool in1 = find(q1.begin(), q1.end(), v) != q1.end();
        bool in2 = find(q2.begin(), q2.end(), v) != q2.end();

        if (in1 || in2) {
            // 存在:删掉原来的,放到 q1 头部
            if (in1) {
                auto it = find(q1.begin(), q1.end(), v);
                q1.erase(it);
            }
            if (in2) {
                auto it = find(q2.begin(), q2.end(), v);
                q2.erase(it);
            }

            q1.push_front(v);

            // q1 满了,尾部移动到 q2 头部
            if (q1.size() > n1) {
                int x = q1.back();
                q1.pop_back();
                q2.push_front(x);

                // q2 满了就淘汰最后一个
                if (q2.size() > n2) {
                    q2.pop_back();
                }
            }
        } else {
            // 不存在:插入 q2 头部
            q2.push_front(v);
            if (q2.size() > n2) {
                q2.pop_back();
            }
        }
    }

    // 输出 q1
    for (int i = 0; i < q1.size(); ++i) {
        if (i > 0) cout << " ";
        cout << q1[i];
    }
    cout << endl;

    // 输出 q2
    for (int i = 0; i < q2.size(); ++i) {
        if (i > 0) cout << " ";
        cout << q2[i];
    }
    cout << endl;

    return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论