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