2016vijos 1-2 股神小L(堆)

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016vijos 1-2 股神小L(堆)相关的知识,希望对你有一定的参考价值。

 

维护前i天的最优解,那么在后面可能会对前面几天的买卖情况进行调整

如果前面买入,买入的这个在后面一定不会卖出

如果前面卖出,卖出的这个可能会在后面变成买入,因为买这个,卖后面的会获得更多的收益

用一个小根堆,存储前面所有的卖出的股票的价格

如果后面想卖出,扔到堆里

如果后面想买入,与堆顶元素比较,如果堆顶大,那就买入;如果堆顶小,那就把堆顶的卖出改为买入,后面那个卖出

即能卖就暂时先卖,扔到堆里,不优再调整

#include<queue>
#include<cstdio>
#include<iostream>

using namespace std;

typedef long long LL;

priority_queue<int,vector<int>,greater<int> >q;

void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-\'0\'; c=getchar(); }
}

int main()
{
    freopen("stock.in","r",stdin);
    freopen("stock.out","w",stdout);
    int n,x,y;
    LL ans=0;
    read(n);
    read(x);
    ans-=x;
    for(int i=2;i<=n;++i)
    {
        read(x);
        if(!(i&1)) 
        {
            ans+=x;
            q.push(x);
        }
        else
        {
            y=q.top();
            if(x>y)
            {
                ans+=x-y*2;
                q.pop();
                q.push(x);
            }
            else ans-=x;
        }
    }
    cout<<ans;
}

 

以上是关于2016vijos 1-2 股神小L(堆)的主要内容,如果未能解决你的问题,请参考以下文章

股神小L [贪心]

[2016北京集训试题14]股神小D-[LCT]

股神小D [点分治 or LCT]

百度在线考试编程题:股神小赛

[XSY 1556] 股神小D LCT维护子树信息

vijos 1464 积木游戏 DP