zoj1088优先队列怎么做
时间: 2023-07-07 13:43:06 浏览: 140
ZOJ1088是一道关于优先队列的题目,可以使用堆来实现。具体步骤如下:
1. 定义一个结构体Node,用于保存每个数的值和出现次数。
2. 定义一个比较函数cmp,用于将小根堆转换为大根堆。
3. 定义一个优先队列priority_queue,用于保存每个数的信息。
4. 依次读入每个数,判断是否在priority_queue中已存在。如果存在,则更新其出现次数;否则,新建一个Node结构体,并将其插入priority_queue。
5. 从priority_queue中取出前k个元素,输出它们的值和出现次数即可。
以下是C++代码实现:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Node {
int value;
int count;
Node(int v, int c) : value(v), count(c) {}
};
struct cmp {
bool operator () (Node a, Node b) {
return a.count < b.count || (a.count == b.count && a.value > b.value);
}
};
int main() {
int n, k;
while (cin >> n >> k) {
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
priority_queue<Node, vector<Node>, cmp> pq;
for (int i = 0; i < n; i++) {
bool flag = false;
for (auto& p : pq) {
if (p.value == nums[i]) {
p.count++;
flag = true;
break;
}
}
if (!flag) {
pq.push(Node(nums[i], 1));
}
}
for (int i = 0; i < k; i++) {
cout << pq.top().value << " " << pq.top().count << endl;
pq.pop();
}
}
return 0;
}
```
这样,就可以通过ZOJ1088优先队列问题了。
阅读全文