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;
}
相關文章
相關標籤/搜索