有n個商品,商品有**和過期時間,在過期時間之前才可以賣出,每天只能賣乙個。求最大利潤。
假如直接對過期時間排序然後貪心會wa。事實上先把所有物品按過期時間排序,把商品的**放進小頂堆裡面,檢測到乙個商品的過期時間《當前堆的大小時,說明現在的時間不夠**所有的商品,就把**最小的丟掉。為什麼這樣的對的呢?每次調整完之後堆裡的東西要麼是賣得完還充裕的,那麼剩下的商品之間填充多出來的時間。否則是(當前時間點)剛剛好夠的,每個物品都能找到在他過期之前的乙個時間賣出。
假如新加進去的商品**最低,直接把它丟了。否則我換出乙個商品,這個商品不是新加進去的,那麼被換出的位置肯定足夠容納新來的那個商品。
#include using namespace std;
typedef long long ll;
pairp[10005];
priority_queue, greater> pq;
int main() ;
}sort(p + 1, p + 1 + n);
for(int i = 1; i <= n; ++i)
ll sum = 0;
while(!pq.empty())
printf("%lld\n", sum);
}}
AcWing 145 超市 146 序列
商品有保質期和價值,要在保質期內把商品賣出才有收入,每天只能賣一件,問產品的的最大利益是多少 這道題目,我們很容易發現是有乙個貪心策略,也就是對於 t 天,我們需要在保證不賣出過期商品的前提下,賣出利潤前t大的商品.所以呢,我們可以把商品按照保質時間排序,然後建立乙個小根堆,對於每乙個數而言,如果說...
超市(stl 貪心)
鏈結 按照過期時間從小到大排序 兩個元素一組可以用pair,放在 vector裡面,排序 當前商品的個數 過期時間,把利潤最小的替換出去 小根堆 include define int long long using namespace std intn priority queue greater ...
帶 反悔 的貪心 超市
題面 超市裡有n件商品,每個商品都有利潤p i pi 和過期時間d i d i,每天只能賣一件商品,過期商品 即當天d i 0 di 0 不能再賣。求合理安排每天賣的商品的情況下,可以得到的最大收益是多少。第一眼看過去,呀,我應該先選利潤大的。但是因為選了利潤大的,錯失了一些利潤還行的,而且就算 選...