D. Buy Low Sell High

D. Buy Low Sell High

题意

给定 n 个数字表示接下来 n 天的的股价,每天可以选择买一份股票,卖一份股票或者什么都不做,最开始拥有零份股票,有足够多的钱,问 n 天之后能获得的最大收益。

思路

很明显,看完题意,你能想到的做法是低价买入高价卖出,但是问题出现在如果现在就卖出了后面可能会有更高的价格可以卖出。怎么解决这个问题呢?

我们可以用一个优先队列(从小到大排序)代表当前所持有的所有股票,枚举每个时候的股票价格,如果队首元素值小于当前枚举值,那么就可以卖出股票赚取利润,队首元素出队,但是注意需要把当前枚举值再次加入队列,因为被弹出的队首元素可能会和后面价格更高股票交易获取更多的利润,可以用当前枚举值与后面价格更高的股票交易,相当于当前枚举的股票没有进行操作。A 买入 B 卖出,B 买入 C 卖出等价于 A 买入 C 卖出,相当于 B 没有操作,在A买入,C卖出。比如 2 5 95-2=3+9-5=4= 9+5-(5-2)=7

代码实现

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
typedef long long ll;
int main(void){
    int n;
    cin >> n;
    ll ans = 0;
    priority_queue<ll,vector<ll>,greater<ll> > q;
    for(int i = 0; i < n; i++){
        ll x;
        cin >> x;
        q.push(x);
        if(x>q.top()){
            ans += x-q.top();
            q.pop();
            q.push(x);
        }
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AC-AC/p/12448156.html