CF 867E. Buy Low Sell High(反悔貪心+堆)
阿新 • • 發佈:2021-08-11
https://codeforces.com/problemset/problem/867/E
題意:
n天,每一天股票市場的股票價格已知
每天可以買入一股,或者賣出一股,或者什麼也不做
初始金錢無限,求最大收益
維護一個小根堆
對於每一天,若前面沒有價格更低的,今日價格加入堆。
若前面有價格更低的,即堆頂比今日價格低,就買入堆頂,今日賣出,累加收益。
然後今日價格加入堆2次,堆頂刪除
為什麼是2次?
每個數只有成為堆頂才有用
當它第一次做堆頂時,之前已經作為賣出價格了,現在又要作為堆頂買入,表示它是一箇中間價。
那麼既然它是中間價,他就還有一次作為買入的機會。
程式碼實現的時候可以不用管前面有沒有價格更低的
直接累加與堆頂的差,插入堆2次
刪除堆頂
因為如果之前沒有比它價格更低的,累加差值的時候是0,刪除堆頂刪掉自己,相當於只插一次
#include<bits/stdc++.h> using namespace std; priority_queue<int,vector<int>,greater<int> >q; int main() { int n,x; long long ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf(作者:xxy 出處:http://www.cnblogs.com/TheRoadToTheGold/ 本文版權歸作者和部落格園共有,轉載請用連結,請勿原文轉載,Thanks♪(・ω・)ノ。"%d",&x); q.push(x); q.push(x); ans+=x-q.top(); q.pop(); } printf("%lld",ans); }