蓝桥赛前复习4:优先队列(堆)

问题描述

本题是一道堆排序模板题。

你需要构建一个堆,可以实现如下操作:

  1. push:将一个正整数 xx 插入堆中。
  2. remove:删除堆顶元素。若此时堆为空,则输出 empty
  3. min:输出堆中最小的元素。若此时堆为空,则输出 empty
  4. print:给定一个小于等于当前堆中元素的数字 kk,你需要在一行内输出当前堆中最小的 kk 个元素,并将其全部删除,数据保证该操作不会在堆为空时出现。

输入格式

第一行输入一个整数 nn,表示操作的数量。

接下来 nn 行,每行一个字符串,表示具体的操作。

输出格式

对于 removeminprint 操作,按照题目要求进行输出。

样例输入

8
push 4
min
remove
remove
push 3
push 7
push 2
print 2

样例输出

4
empty
2 3

代码如下

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    //使用最小堆,优先队列默认是最大堆,需要使用 greater<int> 来实现最小堆
    priority_queue<int, vector<int>, greater<int>> minHeap;
    
    while (n--) {
        string command;
        cin >> command;
        
        if (command == "push") {
            int x;
            cin >> x;
            minHeap.push(x);
        } 
        else if (command == "remove") {
            if (minHeap.empty()) {
                cout << "empty" << endl;
            } else {
                minHeap.pop();
            }
        } 
        else if (command == "min") {
            if (minHeap.empty()) {
                cout << "empty" << endl;
            } else {
                cout << minHeap.top() << endl;
            }
        } 
        else if (command == "print") {
            int k;
            cin >> k;
            vector<int> toPrint;
            
            //将堆中的前 k 个元素提取出来并输出
            for (int i = 0; i < k; ++i) {
                if (minHeap.empty()) break;
                toPrint.push_back(minHeap.top());
                minHeap.pop();
            }
            
            //输出堆中最小的 k 个元素
            for (int i = 0; i < toPrint.size(); ++i) {
                cout << toPrint[i] << " ";
            }
            cout << endl;
        }
    }

    return 0;
}

操作过程详解

第 1 行:push 4

执行了 push 操作,将 4 插入到堆中。

插入后堆中的内容是 [4]

第 2 行:min

执行了 min 操作,输出当前堆的最小值。

当前堆中只有一个元素 4,所以堆顶元素即最小值是 4

输出结果是 4

第 3 行:remove

执行了 remove 操作,删除堆顶元素。

当前堆中只有一个元素 4,删除后堆变空。

输出结果是 empty,因为堆空了。

第 4 行:remove

执行了 remove 操作,删除堆顶元素。

此时堆已经空了,所以执行删除操作时输出 empty

第 5 行:push 3

执行了 push 操作,将 3 插入到堆中。

插入后堆中的内容是 [3]

第 6 行:push 7

执行了 push 操作,将 7 插入到堆中。

插入后堆中的内容是 [3, 7]。因为堆是最小堆,3 仍然是堆顶元素。

第 7 行:push 2

执行了 push 操作,将 2 插入到堆中。

插入后堆中的内容是 [2, 7, 3]。插入 2 后,它成为了堆顶元素。

第 8 行:print 2

执行了 print 2 操作,需要输出堆中最小的 2 个元素并将它们删除。

当前堆的元素是 [2, 7, 3],其中最小的 2 个元素是 23

提取并删除堆顶元素 2,然后堆变为 [3, 7]

再提取并删除堆顶元素 3,堆变为 [7]

输出结果是 2 3

 

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值