POJ 1442 Black Box(大小堆,求第K小的元素)
文章目录
- 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小的元素)相关推荐
- 【堆】leetcode378.有序矩阵中第K小的元素
题目: 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素. 思路: 求第 ...
- 借组磁带机求第K小元素
如果输入在磁带机上, 你的机器只有一个磁带机驱动器和几十字的内存,如何找第K小的数 1. 遍历一遍磁带,随即选择一个数M 2. 再遍历一遍磁带, 计算大于和小于M的个数,这样就可以获得数M在总序列中的 ...
- 选择问题(求第k个最小元素)
什么是选择问题 划分的思路 Lomuto 划分 利用划分求第k小元素 C语言实现 改进 参考资料 什么是选择问题 选择问题(selection problem)是求一个n个数列表的第k个最小元素的问题 ...
- 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字
去年写了一篇对快排进行改进的算法,可以在时间复杂度 O(n)O(n)O(n)的情况下,找到第kkk小的数字. 那时候,我还不知道这个算法叫BFPRT算法--现在知道了,还知道它又被称为中位数的中位数算 ...
- 分治算法 求第k小元素 O(n) O(nlog2^n)
BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排) 各位小伙伴,由于本篇文章代码太过杂乱.我于 2018年12月25日 对文中介绍的算法进行了重写.点击上面的蓝色字体,可以阅读重写后的 ...
- BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)
我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . 去年写了一篇<分治算法 求第kkk小元素 O(n)O(n)O(n) & O( ...
- 两个有序数组合起来求第k小的数+左老师专访ACM大神(笔记)8月5日斗鱼直播实录
1.长度相等的两个有序数组寻找上中位数 注:上中位数1 2 3 4 5 6为3(偶数两个中位数为前面那个) 思路:去掉不可能为上中位数的,剩下的简化组合求上中位数. 1.1 奇数序列 位置 位置 位置 ...
- 求包含n(n>1)个元素的无序序列中第k小的元素。
求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...
- 求两个有序数组中的中位数和第k小的元素
我们首先来看一下这一类题算法的原型: 对应牛客网链接: https://www.nowcoder.com/practice/08588d568e164e0a9958b5d6a3c351f5?tpId= ...
最新文章
- Spring Boot中如何扩展XML请求和响应的支持
- JavaScript面向对象编程深入分析
- 最优布线问题(普里姆算法)
- Visual C++位图操作(1)
- 如何上传本地文件到github又如何删除自己的github仓库
- pyspark 修改python版本_python – Pyspark从日期到字符串更改列的类型
- 【论文解读】IJCAI2019: 面向中文NER 基于lexicon rethinking的CNN模型
- 六石管理学:提出分形进度的概念
- jeecg框架MybatisPlus出现查询条件重复现象
- MSNMessenger忌讳用法大全(转)
- 程序员最爱字体_网页设计师最爱的十大字体
- 区块链技术介绍PPT
- Altium_Designer17-PCB-如何重新定义板子外形
- Stata:各类全要素生产率TFP估算方法
- React中文文档 9. 表单
- 机顶盒(Iptv)EPG页面实现视频播放
- 仪表图形怎么用c语言写,科一仪表盘图标大全
- 计算机电源接口在哪,电脑电源接口定义图解
- 南理工硕士论文latex模板
- 学习总结和方法经验一
热门文章
- ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
- 存储过程 while is null_4.2 串的存储实现(2)
- linux学习交流群,求linux(ubuntu)学习交流群
- linux启用ipmi服务,使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理
- php5.6 pdo.dll 没有,php5.6没有pdo怎么办
- docker选择安装位置_自定义WSL的安装位置,别再装到C盘啦
- P1133 教主的花园 (动态规划)
- BootStrap 用法
- Node.js mimimn图片批量下载爬虫 1.00
- C#.net同步异步SOCKET通讯和多线程总结(转)