POJ 1456 貪心 優先佇列 並查集

2021-10-18 10:39:01 字數 1296 閱讀 6831

題意

傳送門 poj 1456 supermarket

題解貪心 + 優先佇列

使用貪心策略,對於每個時間點 t

tt,在保證不賣出過期商品的情況下,盡量賣出利潤前 t

tt 大的商品。按照過期時間從小到大對商品排序,順序考慮商品,使用優先佇列動態維護滿足上述性質的方案。

對於每乙個掃瞄到的商品,若其過期時間大於當前堆中的商品數(此時之前掃瞄過的商品因為最優性或過期時間限制不能再加入堆中)將此商品加入方案;反之,若商品利潤大於堆中商品利潤的最小值,那麼可以使用此商品替換堆頂對應的商品。時間複雜度 o(n

log⁡n)

o(n\log n)

o(nlogn)

#include

#include

#include

using

namespace std;

const

int maxn =

10005

;struct prod

} p[maxn]

;int n;

intmain()

printf

("%d\n"

, res);}

return0;

}

貪心 + 並查集

使用貪心策略,優先考慮賣出利潤大的商品,對於每乙個商品,在過期之前盡量晚的賣出。

對商品按照利潤降序排序,順序處理。使用並查集維護從過期時間向前數的第乙個未占用位置。具體而言,每次考慮商品,查詢 d

dd 的根節點 r

rr,若根節點非零,則將這個商品在根節點對應的時間賣出,同時將 r

rr 指向 r−1

r-1r−

1,即賣出時間的前一天,此時各節點的根節點代表從當前節點前向數的第乙個未占用位置。僅使用路徑壓縮進行優化,時間複雜度 o(n

log⁡n)

o(n\log n)

o(nlogn)

#include

#include

using

namespace std;

const

int maxn =

10005

;struct prod

} p[maxn]

;int n, d, fa[maxn]

;int

find

(int x)

intmain()

printf

("%d\n"

, res);}

return0;

}

POJ 1456 (貪心 並查集)

題目鏈結 有n件物品,每件物品有個價值和最後的保質期,如果物品在保質期內賣出能拿到對應的價值。沒件物品賣出要1天時間。問n件物品能拿到的最大價值。先貪心排序價值。值的先 而1到t時間段內空閒時間用並查集來維護。每次賣出一件時間。剩下的時間減1,直到為0 是剩下的時間,也就是fin t include...

POJ 1456 貪心 並查集

題目大意 給n個商品,每個商品有利潤pi和過期時間di,每天只能賣乙個商品,過期的不能再賣,求如何安排每天賣的東西使收益最大。題目思路 先將利潤從大到小排序,由於每個物品賣的越遲,給其他物品留下的空間也就越多,所以需要將物品放在能賣的最後一天賣。建立並查集,維護每個點最後乙個可以賣的地方,每賣出乙個...

poj 1456 貪心 並查集優化

題意 題目鏈結 有n個商品,每個商品有兩個屬性val 和day,val表示商品的價值,day 表示商品最後賣出去的期限,賣每個商品需要一天的時間。題解 貪心,貪心測率和hdu 1789 一樣。按照val從大到小排序。然後從第乙個開始,如果它的最後期限沒有被占用,這天就用來買這件商品,如果被占用就在這...