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);
}

 

posted @ 2021-08-11 21:55  TRTTG  阅读(62)  评论(0编辑  收藏  举报