Acwing145. 超市[C++题解]:贪心
文章目錄
- 本題思路
- 題目鏈接
本題思路
題目重述:給定n件商品的利潤(rùn)和過(guò)期時(shí)間,每天只能賣(mài)1件,問(wèn)最大利潤(rùn)是多少。
題目思路:
貪心。 需要按照過(guò)期時(shí)間從早到晚排序。如果過(guò)期時(shí)間是3天的商品有≤3件商品賣(mài)掉是沒(méi)問(wèn)題的;問(wèn)題出在過(guò)期時(shí)間是m天,結(jié)果商品有>m件(heap.size()>p.first),這時(shí)候需要舍棄一些商品,貪心策略是每次舍棄利潤(rùn)最低的商品。
維護(hù)一個(gè)vector< pair<int,int>> vec,vec里面第一關(guān)鍵字存過(guò)期時(shí)間,第二關(guān)鍵字存利潤(rùn);和一個(gè)小根堆heap,heap里面存的是商品的利潤(rùn)。
過(guò)程:
先排序,后插入到小根堆,最后便利小根堆得到利潤(rùn)之和即可。
ac代碼
#include<bits/stdc++.h> using namespace std;int n; typedef pair<int,int> PII;int main(){while(cin>>n){int res=0;vector<PII> vec(n);priority_queue<int,vector<int>,greater<int>>heap; //小根堆for(int i=0;i<n;i++) cin>>vec[i].second>>vec[i].first; //first是過(guò)期時(shí)間sort(vec.begin(),vec.end());//默認(rèn)按照第一關(guān)鍵字排序,從小到大//按照過(guò)期時(shí)間從小到大排序//遍歷vecfor(auto p:vec){heap.push(p.second); //利潤(rùn)放進(jìn)來(lái)if(heap.size()>p.first){ //今天到期的物品超過(guò)限度heap.pop();}}while(heap.size()){res+=heap.top();heap.pop();}cout<<res<<endl;}}題目鏈接
145. 超市
超市里有N件商品,每件商品都有利潤(rùn)pi和過(guò)期時(shí)間di,每天只能賣(mài)一件商品,過(guò)期商品不能再賣(mài)。
求合理安排每天賣(mài)的商品的情況下,可以得到的最大收益是多少。
輸入格式
輸入包含多組測(cè)試用例。
每組測(cè)試用例,以輸入整數(shù)N開(kāi)始,接下來(lái)輸入N對(duì)pi和di,分別代表第i件商品的利潤(rùn)和過(guò)期時(shí)間。
在輸入中,數(shù)據(jù)之間可以自由穿插任意個(gè)空格或空行,輸入至文件結(jié)尾時(shí)終止輸入,保證數(shù)據(jù)正確。
輸出格式
對(duì)于每組產(chǎn)品,輸出一個(gè)該組的最大收益值。
每個(gè)結(jié)果占一行。
數(shù)據(jù)范圍
0≤N≤10000,
1≤pi,di≤10000
最多有14組測(cè)試樣例
輸入樣例:
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
總結(jié)
以上是生活随笔為你收集整理的Acwing145. 超市[C++题解]:贪心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优先队列如何按照pair 的第二关键字排
- 下一篇: Leetcode1706. 球会落何处[