用c++完成 有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数。比如 1 2 2 3 4 6 中,第 3 小的数就是2. 牛牛觉得这个游戏太简单了,想加一点难度,现在牛牛有 m 个操作,每个操作有两种类型。 1 x 1 代表操作一,给数组中加一个元素 x 。(0 ≤ x ≤ 1e9) 2 2 代表操作二,查询第 k 小的数。如果没有 k 个数就输出−1 第一行有三个整数,n m k,(1≤n,m,k≤2e5) 第二行包含 n 个整数 a[i] ( 0 ≤ a[i] ≤ 1e9) 接下来m行,每行代表一个操作 每次查询输出一个第 k 小的数
时间: 2024-04-13 12:30:11 浏览: 120
您可以使用C++的STL库中的priority_queue来实现这个问题。首先,您需要将数组a中的元素插入到priority_queue中,并设置为大顶堆。然后,根据操作类型执行相应的操作。
以下是一个示例代码:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 构建大顶堆
priority_queue<int> pq(a.begin(), a.end());
for (int i = 0; i < m; i++) {
int type;
cin >> type;
if (type == 1) {
int x;
cin >> x;
// 添加元素到大顶堆
pq.push(x);
} else if (type == 2) {
if (pq.size() < k) {
cout << -1 << endl;
} else {
// 查询第k小的数
priority_queue<int> temp_pq(pq);
for (int j = 0; j < k - 1; j++) {
temp_pq.pop();
}
cout << temp_pq.top() << endl;
}
}
}
return 0;
}
```
该代码首先读取n、m和k的值,并将n个整数读入数组a中。然后,使用priority_queue构造大顶堆。接下来,根据操作类型执行相应的操作。当执行操作二时,如果大顶堆中的元素个数小于k,则输出-1;否则,复制大顶堆为临时堆,将临时堆中的前k-1个元素出队,然后输出临时堆的顶部元素,即第k小的数。
希望对您有帮助!
阅读全文