1. 程式人生 > 其它 >CF 867E. Buy Low Sell High(反悔貪心+堆)

CF 867E. Buy Low Sell High(反悔貪心+堆)

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(
"%d",&x); q.push(x); q.push(x); ans+=x-q.top(); q.pop(); } printf("%lld",ans); }
作者:xxy 出處:http://www.cnblogs.com/TheRoadToTheGold/ 本文版權歸作者和部落格園共有,轉載請用連結,請勿原文轉載,Thanks♪(・ω・)ノ。