Top-K 问题
代码:#include
include
include
include
using namespace std;
int main() {
int N, M;
cin >> N >> M;
// 最小堆(优先队列)维护当前最大的M个元素
priority_queue<long long, vector<long long>, greater<long long>> heap;
// 读取所有资产值
for (int i = 0; i < N; i++) {
long long asset;
cin >> asset;
if (heap.size() < M) {
heap.push(asset); // 堆未满时直接插入
} else if (asset > heap.top()) {
heap.pop(); // 移除堆顶(当前最小元素)
heap.push(asset); // 插入更大的元素
}
}
// 将堆中元素存入数组并逆序排序
vector<long long> result;
while (!heap.empty()) {
result.push_back(heap.top());
heap.pop();
}
reverse(result.begin(), result.end());
// 输出结果
for (int i = 0; i < result.size(); i++) {
if (i > 0) cout << " ";
cout << result[i];
}
return 0;
}
核心算法逻辑
cpp
运行
for (int i = 0; i < N; i++) {
long long asset;
cin >> asset;
if (heap.size() < M) {
heap.push(asset); // 堆未满时直接插入
} else if (asset > heap.top()) {
heap.pop(); // 移除堆顶(当前最小元素)
heap.push(asset); // 插入更大的元素
}
}
遍历所有 N 个元素:
如果堆的大小小于 M,直接将元素插入堆
如果堆已满且当前元素比堆顶大:
移除堆顶元素(当前最小元素)
将当前元素插入堆

浙公网安备 33010602011771号