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

 

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

若是前面买入,买入的这个在后面必定不会卖出git

若是前面卖出,卖出的这个可能会在后面变成买入,由于买这个,卖后面的会得到更多的收益spa

用一个小根堆,存储前面全部的卖出的股票的价格code

若是后面想卖出,扔到堆里blog

若是后面想买入,与堆顶元素比较,若是堆顶大,那就买入;若是堆顶小,那就把堆顶的卖出改成买入,后面那个卖出get

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

#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;
}
相关文章
相关标签/搜索