維護前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; }