解题思路:
时间复杂度
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复