第 K 小數字問題 (優先佇列實現)

2021-10-11 11:18:45 字數 1018 閱讀 6543

首先了解優先佇列:

可以理解優先佇列就是乙個含有內部排序的佇列,具有佇列的一切屬性,本質上是通過堆來實現的。

定義語法:

priority_queue

type 是資料型別 (注意:資料元素的型別可以是pair型別)

container 由陣列實現的一些資料結構,如:vector,deque,不可以是list型別,就是存放元素的容器

functional 是內部排序的方式

當使用的資料型別是基本的內建的資料型別的時候就可以直接傳入型別來建立優先佇列,預設是大根堆(降序序列)

小根堆 公升序序列

priority_queue q;

小根堆 降序序列

priority_queue q;

第 k 小問題:

題目:第k小問題題目

思路:維護乙個元素數量上限為k的乙個優先佇列,按照大根堆的形式進行排序,佇列的首元素就是第k小的元素,如果當前元素的數量小於k就不斷向其中加入元素,否則,判斷當前的佇列頭部元素與待加入的元素的大小,如果小於對頭元素,就直接將當前的對頭元素出隊,再入隊當前的待加入即可。

**:

#include

#include

#include

#include

#include

#include

#include

#include

#define fast ios::sync_with_stdio(false)

#define ll long long

#pragma gcc optimize(2)

using

namespace std;

int n,m,k;

intmain

(void)}

for(

int i =

0;i < m;i++)}

else

if(t ==

2) //詢問元素 }

return0;

}

字典序的第K小數字

給定整數 n 和 k,找到 1 到 n 中字典序第 k 小的數字。1 k n 109。n 10時,字典序 1,10,2,3,4,5,6.可以把這n個數字看成字典樹,那麼每乙個字首都代表乙個數字,其中每個節點有10個兒子,0 9.那麼字典樹的先序遍歷的第k個就是答案。所以得到了乙個o k 的做法。這類...

440 字典序的第K小數字

題目鏈結 解題思路 一次計算以1,2,3,4,5,6,7,8,9,10,11,12.為字首的,不超過上界n的數字個數,對數字總數進行累加,累加的和為k時,將此時字首的下乙個數字prefix 1返回,即為字典序的第k小數字。c include using namespace std prefix是字首...

FloatToStr問題 保留小數字

如何使乙個字串 23.89023482 在使用floattostr變為23.90?有什麼規則嗎?是不是小數後第2位四捨五入?formatfloat 0.0 f 0 用下面這個函式要好的多 floattostrf 23.89023482 ffnumber,12,2 試試吧,用了很久了,不知道格式對不對...