1. 程式人生 > >讓priority_queue支援小根堆的幾種方法

讓priority_queue支援小根堆的幾種方法

前言

priority_queue預設是大根堆,也就是大的元素會放在前面

例如

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int a[15]={0,1,4,2,3,5};
const int n=5;
int main()
{
    for(int i=1;i<=n;i++)    q.push(a[i]);
    while(q.size()!=0)
        printf(
"%d ",q.top()),q.pop(); return 0; }

它的輸出結果是

那如何讓priority_queue支援小根堆呢?:question:

方法一

將所有的數全部取負

這樣的話絕對值小的數會變大,絕對值大的數會變小

這樣就能實現小根堆了

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int a[15]={0,1,4,2,3,5};
const int n=5; int main() { for(int i=1;i<=n;i++) q.push(-a[i]); while(q.size()!=0) printf("%d ",-q.top()),q.pop(); return 0; }

方法二

利用STL中自帶的小根堆,很簡單,只要在定義的時候寫成

 就好

#include<iostream>
#include<cstdio>
#include<queue>
using namespace
std; priority_queue<int,vector<int>,greater<int> >q;//這樣就可以實現小根堆了 int a[15]={0,1,4,2,3,5}; const int n=5; int main() { for(int i=1;i<=n;i++) q.push(a[i]); while(q.size()!=0) printf("%d ",q.top()),q.pop(); return 0; }

另外

priority_queue是支援自定義比較函式的

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int n=5;
struct node
{
    int x,y;
    node(){x=y=0;}
    node(int a,int b){x=a;y=b;}
};
priority_queue<node>q;
bool operator<(const node &a,const node &b)
{
    if(a.x!=b.x)return a.x>b.x;
    return a.y<b.y;
}
int a[15]={0,1,4,4,3,5};
int b[15]={0,2,1,2,3,4};
int main()
{
    for(int i=1;i<=n;i++)    q.push(node(a[i],b[i]));
    while(q.size()!=0)
        printf("%d %d\n",q.top().x,q.top().y),q.pop();
    return 0;
}

注意:priority_queue自定義函式的比較與sort正好是相反的,也就是說,如果你是把大於號作為第一關鍵字的比較方式,那麼堆頂的元素就是第一關鍵字最小的

還可以這麼寫

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int n=5;
struct node
{
    int x,y;
    node(){x=y=0;}
    node(int a,int b){x=a;y=b;}
    bool operator <(const node &a)const 
    {
        if(a.x!=x) return a.x<x;
        return a.y>y;
    }
};
priority_queue<node>q;
int a[15]={0,1,4,4,3,5};
int b[15]={0,2,1,2,3,4};
int main()
{
    for(int i=1;i<=n;i++)    q.push(node(a[i],b[i]));
    while(q.size()!=0)
        printf("%d %d\n",q.top().x,q.top().y),q.pop();
    return 0;
}

相關推薦

priority_queue支援方法

前言 priority_queue預設是大根堆,也就是大的元素會放在前面 例如 #include<iostream> #include<cstdio> #include<queue> using namespace std; priority_qu

Java中Double保留後數位的方法

絕對值 解決 quest getpara 直接 mil pri 表單提交 bsp 最近做個小實驗,其中一部分要求將表單提交的數據轉換為double,這個功能其實很簡單直接一句Double.parseDouble(request.getParameter("chinese")

關於div元素垂直居中的方法

如何用讓巢狀在裡面的div居中 本人是一個前端新手,如何讓兩個相互巢狀的div,讓裡面的div居中是一個比較簡單的問題,面試也常問,我就從其他部落格中提取稍微總結一下(轉載侵刪),也加了一點自己的困惑和理解,錯誤的地方希望能有人指出: 利用position

Python指令碼暫停執行的方法(轉載)

轉自:讓Python指令碼暫停執行的幾種方法 1.time.sleep(secs) 參考文件原文: Suspend execution for the given number of seconds. The argument may be a

java中保留double數位的方法

public static void main(String[] args) { //方法一 這個的優勢是得出的double 使用這個方法還有個問題當num=4.015得到的值是4.01 下面兩種方法的結果是4.02 double num = 4.016;

HDFS支援資料壓縮的方法探討

HDFS支援資料壓縮存在以下幾種方法: 1、在HDFS之上將資料壓縮好後,再儲存到HDFS 2、在HDFS內部支援資料壓縮,這裡又可以分為幾種方法:     2.1、壓縮工作在DataNode上完成,這裡又分兩種方法:            2.1.1、資料接收完後,再壓縮

windows下去掉快捷方式圖標的箭頭的方法

快捷方式 classes hid script class script.sh cut 命令 piff 去掉快捷方式圖標的小箭頭的幾種方法 第一種: 點開始菜單,點運行,輸入以下命令後回車。即可解決 cmd /k reg delete "HKEY_CLASSES_

stl之priority_queue很慢?

stl中priority_queue底層是二叉堆實現,但是我自己實現了一個二叉堆,測試速度竟然比priority快好多倍,不知道為什麼? 執行100次,每次push1000個數,pop1000個數 執行結果: 自己的執行時間:62ms stl中priority_queue執

Linux 技巧:進程在後臺可靠執行的方法

stl 選項 con 中斷 program ng- dem 不同 正在 我們常常會碰到這種問題。用 telnet/ssh 登錄了遠程的 Linux server,執行了一些耗時較長的任務, 結果卻因為網絡的不穩定導致任務中途失敗。怎樣讓命令提交後不受本地關閉終端

SSH免登陸ESXI操作更便捷安全(常用工具)

esxi vmware ssh工具 免登陸 授權訪問通常在企業環境中,管理員很少去機房在物理機面前進行操作,大部分管理員喜歡遠程管理主機,這樣既方便又高效。在windows上我們使用遠程桌面,在Linux上則使用SSH來連接。ESXi就是一個以Linux為核心改寫的操作系統,因此ESXi中也保留了SSH

進程在後臺可靠運行的方法

讓進程在後臺可靠運行的幾種方法 nohup setsid & disown screen讓進程在後臺可靠運行的幾種方法說明:我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由於網絡的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終

模板

esp printf 最小值 namespace 記得 class queue 二叉 %d 手寫堆 可以視作是一種完全二叉樹結構 #include<iostream> #include<cstring> #include<algor

【模板】

names ret %d opened code spa ace cnblogs 一個空格 因為根的實現方法(優先隊列)默認為大根堆,即從大到小排列,所以在需要的時候需要手寫小根堆。 題目描述 如題,初始小根堆為空,我們需要支持以下3種操作: 操作1: 1 x 表示將x插入

scala寫算法-用解決topK

app unit roo ast atm mark 構建 操作 mnt topK問題是指從大量數據中獲取最大(或最小)的k個數,比如從全校學生中尋找成績最高的500名學生等等. 本問題可采用小根堆解決.思路是先把源數據中的前k個數放入堆中,然後構建堆,使其保持堆序(可以簡單

Linux 進程在後臺可靠運行的方法

lin post body nohup 所有 sid iso gpo 啟動 nohup 忽略 hang up 信號 setsid 使得父進程為1(init) & 使得父進程為1(init) disown 可以對已經啟動的進程進行忽略

nohup 進程在後臺可靠運行的方法

AR 列表 進程 opp ron bsp HA 環境 per 1. nohup nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號。 nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準

關於dijkstra的優化

eat algo 最壞情況 str 但是 lan 部分 是我 算法 YY引言 在NOI2018D1T1中出現了一些很震驚的情況,D1T1可以用最短路解決,但是大部分人都在用熟知的SPFA求解最短路。而SPFA的最壞復雜度能夠被卡到$O(VE)$。就是邊的數量乘以點的數量,

關於的看法

  最近在複習小根堆,看了好多部落格,一些思想記錄一下。   早上自己團隊在比賽的時候,第一道題爆零,老師講是用小根堆解決,所以好好複習了一下小根堆; 首先,小根堆其實就是二叉樹。當然,最出名的是一個叫做堆排序的東東,它的時間複雜度為O(nlogn)。足夠的小吧,此外它還有一個別名叫做二叉樹排序。 贈送

Spark (TreeSet)實現TopN問題-------基於上一篇文章的優化

第三步優化:假如資料量非常大的話,toList方法會產生記憶體溢位,使用treeSet方法可以解決 treeset既可以實現排序,還能有效的控制輸出的大小。 package day02 import java.net.URL import org.apach

html+css, div水平垂直居中的方式

在web前端開發中經常需要使用到讓div進行水平和垂直居中的技術,現在我們就來談談如何實現div水平垂直居中(如下圖所示)   div元素在螢幕上水平垂直居中的三種方法 HTML中有個class為box的div元素,通過修改css樣式讓box元素在頁面水平垂直居中顯示