BZOJ 4524 貪心 二叉堆)

2022-03-29 07:59:49 字數 869 閱讀 2433

若乙個大於 11 的整數m分解質因數後到的有重複的質因數序列有k 項,其最大的質因子為 \(a_k\),並且滿足 \(^k \leq n,k<128\),我們就稱整數 m 為 n-偽光滑數。

現在給出 n*n,求所有整數中,第 k大的 n-偽光滑數。

先篩出128以內的所有質數

根據題意貪心考慮,顯然m的質因數分解中最大的質數越大越好

於是我們把每個質數p的1次方,2次方,3次方...k次方(\(p^k \leq n\))加入堆(堆頂元素最大).

然後取k-1次,每次對於取出來的數x,除掉它的最大質因子,乘上乙個次大的質因子,這樣就構造出了乙個更小的數,且它顯然是 n-偽光滑數

取完k-1次後的堆頂就是最大的質數了

用優先佇列模擬這個過程,由於優先佇列中的元素可能會重複,會影響結果(重複的數被取出多次,導致取出來的不是第k大的),我們只要一次取出所有的最大元素即可

#include#include#include#include#include#define maxn 1005

using namespace std;

long long n;

int k;

int cnt=0;

int vis[maxn];

int prime[maxn];

void sieve(int n)

for(int j=1;j<=cnt&&i*prime[j]<=n;j++) }}

priority_queueq;

int main()

} for(int i=1;i<=k-1;i++)

} }printf("%lld\n",q.top());

}

hrbust2223 水題 貪心 二叉堆

題目 題意 n 個人排隊在 m個出水口前接水,第 i個人接水需時為 t i 請問接水的最短用時是多少?分析 貪心 二叉堆。將所有人從大到小排序,依次插入m個出水口,每次要插入到用時最小的出水口,最後輸出m個出水口中用時最多的那乙個。本 用優先佇列實現 include include include ...

(二叉)堆操作

堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...

簡單 二叉堆

堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...