文章目录

  • 1. 题目链接
  • 2. 题目解读
  • 3. 代码
    • 3.1 Runtime Error 代码

1. 题目链接

http://poj.org/problem?id=1442

2. 题目解读


可以利用大小堆,大堆长度从1开始,每次+1
大堆元素都比小堆的小,那么大堆顶的元素就是第k小的元素

3. 代码

3.1 Runtime Error 代码

本地运行示例,结果一致,poj提交RE,还没解决

/*** @description: 用大小堆求解* @author: michael ming* @date: 2019/5/31 23:21* @modified by: */
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
int arr[30005], total[30005];
int main()
{int arrlen, k, arrindex=1, maxheapsize=0, insertnum , minheapsize;cin >> arrlen >> k;for(int i = 1; i <= arrlen; ++i)cin >> arr[i];for(int i = 1; i <= k; ++i)cin >> total[i];vector<int> maxheap, minheap;for(int i = 1; i <= k; ++i){maxheapsize++;minheapsize = total[i] - maxheapsize;insertnum = total[i] - total[i-1];if(insertnum == 0 && !minheap.empty()){maxheap.push_back(minheap[0]);push_heap(maxheap.begin(), maxheap.end());//默认采用 < , 大堆pop_heap(minheap.begin(), minheap.end(), greater<int>());minheap.pop_back();}while(insertnum--){if (maxheap.empty()){maxheap.push_back(arr[arrindex]);}else{//----选择插入哪个堆-----if (arr[arrindex] <= maxheap[0]){if(maxheap.size() >= maxheapsize){minheap.push_back(maxheap[0]);//大堆顶进入小堆push_heap(minheap.begin(), minheap.end(), greater<int>());pop_heap(maxheap.begin(), maxheap.end());//堆顶到末尾了maxheap.pop_back();//删除到末尾的"堆顶"}maxheap.push_back(arr[arrindex]);push_heap(maxheap.begin(), maxheap.end());//默认采用 < , 大堆}else if (arr[arrindex] > maxheap[0]){if(minheap.size() >= minheapsize){maxheap.push_back(minheap[0]);push_heap(maxheap.begin(), maxheap.end());//默认采用 < , 大堆pop_heap(minheap.begin(), minheap.end(), greater<int>());minheap.pop_back();}minheap.push_back(arr[arrindex]);push_heap(minheap.begin(), minheap.end(), greater<int>());//小堆,采用 >}}arrindex++;}cout << maxheap[0] << endl;}return 0;
}

POJ 1442 Black Box(大小堆,求第K小的元素)相关推荐

  1. 【堆】leetcode378.有序矩阵中第K小的元素

    题目: 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素. 思路: 求第 ...

  2. 借组磁带机求第K小元素

    如果输入在磁带机上, 你的机器只有一个磁带机驱动器和几十字的内存,如何找第K小的数 1. 遍历一遍磁带,随即选择一个数M 2. 再遍历一遍磁带, 计算大于和小于M的个数,这样就可以获得数M在总序列中的 ...

  3. 选择问题(求第k个最小元素)

    什么是选择问题 划分的思路 Lomuto 划分 利用划分求第k小元素 C语言实现 改进 参考资料 什么是选择问题 选择问题(selection problem)是求一个n个数列表的第k个最小元素的问题 ...

  4. 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字

    去年写了一篇对快排进行改进的算法,可以在时间复杂度 O(n)O(n)O(n)的情况下,找到第kkk小的数字. 那时候,我还不知道这个算法叫BFPRT算法--现在知道了,还知道它又被称为中位数的中位数算 ...

  5. 分治算法 求第k小元素 O(n) O(nlog2^n)

    BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排) 各位小伙伴,由于本篇文章代码太过杂乱.我于 2018年12月25日 对文中介绍的算法进行了重写.点击上面的蓝色字体,可以阅读重写后的 ...

  6. BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)

    我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . 去年写了一篇<分治算法 求第kkk小元素 O(n)O(n)O(n) & O( ...

  7. 两个有序数组合起来求第k小的数+左老师专访ACM大神(笔记)8月5日斗鱼直播实录

    1.长度相等的两个有序数组寻找上中位数 注:上中位数1 2 3 4 5 6为3(偶数两个中位数为前面那个) 思路:去掉不可能为上中位数的,剩下的简化组合求上中位数. 1.1 奇数序列 位置 位置 位置 ...

  8. 求包含n(n>1)个元素的无序序列中第k小的元素。

    求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...

  9. 求两个有序数组中的中位数和第k小的元素

    我们首先来看一下这一类题算法的原型: 对应牛客网链接: https://www.nowcoder.com/practice/08588d568e164e0a9958b5d6a3c351f5?tpId= ...

最新文章

  1. Spring Boot中如何扩展XML请求和响应的支持
  2. JavaScript面向对象编程深入分析
  3. 最优布线问题(普里姆算法)
  4. Visual C++位图操作(1)
  5. 如何上传本地文件到github又如何删除自己的github仓库
  6. pyspark 修改python版本_python – Pyspark从日期到字符串更改列的类型
  7. 【论文解读】IJCAI2019: 面向中文NER 基于lexicon rethinking的CNN模型
  8. 六石管理学:提出分形进度的概念
  9. jeecg框架MybatisPlus出现查询条件重复现象
  10. MSNMessenger忌讳用法大全(转)
  11. 程序员最爱字体_网页设计师最爱的十大字体
  12. 区块链技术介绍PPT
  13. Altium_Designer17-PCB-如何重新定义板子外形
  14. Stata:各类全要素生产率TFP估算方法
  15. React中文文档 9. 表单
  16. 机顶盒(Iptv)EPG页面实现视频播放
  17. 仪表图形怎么用c语言写,科一仪表盘图标大全
  18. 计算机电源接口在哪,电脑电源接口定义图解
  19. 南理工硕士论文latex模板
  20. 学习总结和方法经验一

热门文章

  1. ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
  2. 存储过程 while is null_4.2 串的存储实现(2)
  3. linux学习交流群,求linux(ubuntu)学习交流群
  4. linux启用ipmi服务,使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理
  5. php5.6 pdo.dll 没有,php5.6没有pdo怎么办
  6. docker选择安装位置_自定义WSL的安装位置,别再装到C盘啦
  7. P1133 教主的花园 (动态规划)
  8. BootStrap 用法
  9. Node.js mimimn图片批量下载爬虫 1.00
  10. C#.net同步异步SOCKET通讯和多线程总结(转)