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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值