二叉堆具體來說就是支援插入刪除查詢最值的資料結構,是一棵滿足堆性質的完全二叉樹,樹上的每乙個節點對應乙個權值。若樹中的任意乙個節點的權值都小於其父節點的權值,則稱該二叉樹滿足大根堆性質,即我們常說的大根堆。若書中任意乙個節點的全職都打與其父親節點的權值,則稱該二叉樹滿足小根堆性質,即小根堆。二者統稱為二叉堆。
我們可以通過stl(c++標準模板庫)中的優先佇列較為方便的實現堆的功能。
【poj1456】
超市裡有n件商品,每個商品都有利潤pi和過期時間di,每天只能賣一件商品,過期商品(即當天di<=0)不能再賣。
求合理安排每天賣的商品的情況下,可以得到的最大收益是多少。
輸入格式
輸入包含多組測試用例。
每組測試用例,以輸入整數n開始,接下裡輸入n對pi
和di,分別代表第i件商品的利潤和過期時間。
在輸入中,資料之間可以自由穿插任意個空格或空行,輸入至檔案結尾時終止輸入,保證資料正確。
輸出格式
對於每組產品,輸出乙個該組的最大收益值。
每個結果佔一行。
資料範圍
0≤n≤10000
1≤pi,di≤10000
輸入樣例:
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2
5 20 50 10
輸出樣例:
80
185
分析:
貪心思想,相同日期選大的,用小根堆(priority_queue)來維護,如果 堆中的個數大於過期天數則pop,因為是小根堆所以此操作保留了利潤大的商品。
#include#include#include#include#includeusing namespace std;
typedef pairpii;
int t,n,m;
int main()
sort(products.begin(),products.end());
for(auto it:products)
int res=0;
while(heap.size())
cout<【poj2442】
給定m個序列,每個包含n個非負整數。
現在我們可以從每個序列中選擇乙個數字以形成具有m個整數的序列。
很明顯,我們一共可以得到nm
個這種序列, 然後我們可以計算每個序列中的數字之和,並得到nm
個值。現在請你求出這些序列和之中最小的n個值。
輸入格式
第一行輸入乙個整數t,代表輸入中包含測試用例的數量。
接下來輸入t組測試用例。
對於每組測試用例,第一行輸入兩個整數m和n。
接下在m行輸入m個整數序列,數列中的整數均不超過10000。
輸出格式
對於每組測試用例,均以遞增順序輸出最小的n個序列和,數值之間用空格隔開。
每組輸出佔一行。
資料範圍
0,0輸入樣例:
12 31 2 3
2 2 3
輸出樣例:
3 3 4
分析:
此題的關鍵在於合併兩個序列,可以利用優先佇列特性,借助pair完成分組。
#include#include#include#include#includeusing namespace std;
const int n=2010;
int a[n],b[n],c[n];
typedef pairpii;
int t,n,m;
void merge()
); for(int i=0;i}
for(int i=0;i}int main()
for(int i = 0;i < n;i++)
cout<}
}
演算法 二叉堆
實現棧或是佇列與實現優先佇列的最大不同在於對效能的要求。對於棧和佇列,我們的實現能夠在常數時間內完成所有操作 而對於優先佇列,插入元素和刪除最大元素這兩個操作之一在最壞情況下需要線性時間來完成。我們接下來要討論的基於資料結構堆的實現能夠保證這兩種操作都能更快地執行。1.堆的定義 資料結構二叉堆能夠很...
(二叉)堆操作
堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...
簡單 二叉堆
堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...