D. Buy Low Sell High
Posted ac-ac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Buy Low Sell High相关的知识,希望对你有一定的参考价值。
D. Buy Low Sell High
题意
给定 n 个数字表示接下来 n 天的的股价,每天可以选择买一份股票,卖一份股票或者什么都不做,最开始拥有零份股票,有足够多的钱,问 n 天之后能获得的最大收益。
思路
很明显,看完题意,你能想到的做法是低价买入高价卖出,但是问题出现在如果现在就卖出了后面可能会有更高的价格可以卖出。怎么解决这个问题呢?
我们可以用一个优先队列(从小到大排序)代表当前所持有的所有股票,枚举每个时候的股票价格,如果队首元素值小于当前枚举值,那么就可以卖出股票赚取利润,队首元素出队,但是注意需要把当前枚举值再次加入队列,因为被弹出的队首元素可能会和后面价格更高股票交易获取更多的利润,可以用当前枚举值与后面价格更高的股票交易,相当于当前枚举的股票没有进行操作。A 买入 B 卖出,B 买入 C 卖出等价于 A 买入 C 卖出,相当于 B 没有操作,在A买入,C卖出。比如 2 5 9
,5-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;
}
以上是关于D. Buy Low Sell High的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces866D. Buy Low Sell High
CodeForces 867E Buy Low Sell High 思维,贪心
Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E. Buy Low Sell High(代码片
Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E. Buy Low Sell High [贪心 II