0x17二叉堆之超市

2022-05-31 08:24:15 字數 840 閱讀 8854

容易想到乙個貪心策略:在最優解中,對於每個時間(天數) t,應該在保證不賣出過期商品的前提下,盡量賣出利潤前t大的商品。因此,我們可以依次考慮每個商品,動態維護乙個滿足上述性質的方案。

詳細地說,我們把商品按照過期時間排序,建立乙個初始為空的小根堆 (節點權值為商品利潤),然後掃瞄每個商品:

1.若當前商品的過期時間(天數) t等於當前堆中的商品個數,則說明在目前方案下,前t天已經安排了t個商品賣出。此時,若當前商品的利潤大於堆頂權值(即已經安排的t個商品中的最低利潤),則替換掉堆頂(用當前商品替換掉原方案中利潤最低的商品)。

2.若當前商品的過期時間(天數)大於當前堆中的商品個數,直接把該商品插入堆。

3.若當前商品的過期時間(天數)小於當前堆中商品的個數,哦!!!不可能,因為在第一種情況中,若當前商品的過期時間(天數) t等於當前堆中的商品個數,我們就會替換掉商品。

最終,堆裡的所有商品就是我們需要賣出的商品,它們的利潤之和就是答案。該演算法的時間複雜度為o(n logn)。

#include#include#include#includeusing namespace std;

struct nodenodes[10050];

bool operator <(const node &a, const node &b)

sort(nodes+1,nodes+n+1);

priority_queue, greater> q;

for (int i = 1 ; i <=n; ++i) else }}

int ans=0;

while (!q.empty())

cout<}

return 0;

}

codevs 2977 二叉堆練習1x

空間限制 32000 kb 題目等級 silver 已知乙個二叉樹,判斷它是否為二叉堆 小根堆 輸入描述 input description 二叉樹的節點數n和n個節點 按層輸入 輸出描述 output description yes或no 樣例輸入 sample input 樣例輸入1 1 4 9...

Jzoj3805 小X的二叉堆計數

題意 給你n個不同的數問你能構成多少個不同的二叉堆 顯然不能列舉,我們考慮用遞推 我們令f i 表示以i為根的二叉堆有多少種 令l,r為i的左右兒子,令size i 為以i為根的堆的大小 那麼顯然,f i f l f r c size i 1,size l 因為n個數互不相同,所以沒有重複 相當於是...

二叉樹學習筆記(二)之堆

附上一張總結圖 堆是一類完全二叉樹,常用於實現排序,選擇最小 大 值和優先佇列等 優先佇列 一種特殊的佇列,佇列中元素出棧的順序是按照元素的優先權大小,而不是元素入隊的先後順序。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 即按完全二叉樹的結點編號排列,n個結點的關鍵字序列稱為堆。堆可...