利用队列结构实现车厢重排问题。车厢重排问题如下: 一列货车共有 n 节车厢,每个车厢都有自己的编号,编号范围从 1~n。给定任意次序的 车厢,通过转轨站将车厢编号按顺序重新排成 1~n。转轨站共有 k 个缓冲轨,缓冲轨位于入 轨和出轨之间。开始时,车厢从入轨进入缓冲轨,经过缓冲轨的重排后,按 1~n 的顺序进入 出轨。缓冲轨按照先进先出方式,编写一个算法,将任意次序的车厢进行重排,输出每个缓 冲轨中的车厢编号。 提示: 1、 一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨, 重新编排
时间: 2023-06-04 11:04:25 浏览: 205
的顺序为 1~n。 2、 算法应当使用队列结构实现,通过队列的先进先出特性模拟缓冲轨的运作。 3、 每个缓冲轨可以装载多个车厢,但必须保证车厢的顺序正确。 4、 算法实现的时间复杂度应当在 O(nlogn) 左右。
首先,将所有车厢按编号顺序入轨,然后在每个缓冲轨上维护一个队列,同时维护一个大小为 k 的优先队列。优先队列中存放当前所有缓冲轨队头的车厢编号,按编号升序排列。当入轨上的车厢编号为当前优先队列队头时,将队头弹出,说明该车厢已经在缓冲轨中排队,将其从优先队列中删除。在缓冲轨中,当新的车厢需要入队时,将其加入缓冲轨队列的末尾。如果此时缓冲轨队列的长度超过了 k,说明队列已经满了,需要将队头的车厢弹出并输出,同时将其从优先队列中删除,以给后续的车厢腾出位置。当所有车厢都进入缓冲轨并排队完成后,依次输出每个缓冲轨队列中的车厢编号,即为车厢的重排后的顺序。
代码实现如下:
```
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
queue<int> in, out;
priority_queue<int, vector<int>, greater<int>> pq[k];
for (int i = 0; i < n; i++) {
int x;
cin >> x;
in.push(x);
}
for (int i = 1; i <= n; i++) {
while (!in.empty() && in.front() == i) {
in.pop();
cout << i << " ";
}
for (int j = 0; j < k; j++) {
if (!pq[j].empty() && pq[j].top() == i) {
pq[j].pop();
cout << i << " ";
}
}
while (!out.empty() && out.front() == i) {
out.pop();
cout << i << " ";
}
if (!in.empty()) {
bool flag = false;
for (int j = 0; j < k; j++) {
if (pq[j].size() < k) {
pq[j].push(in.front());
in.pop();
flag = true;
break;
}
}
if (!flag) {
out.push(in.front());
in.pop();
}
}
}
for (int i = 0; i < k; i++) {
while (!pq[i].empty()) {
cout << pq[i].top() << " ";
pq[i].pop();
}
}
while (!out.empty()) {
cout << out.front() << " ";
out.pop();
}
return 0;
}
```
阅读全文