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

 

posted @ 2018-04-27 21:53  TRTTG  阅读(459)  评论(0编辑  收藏  举报