题目大意如下
你可以预测未来n天的股价,你需要设计一个算法来计算未来n你能活得的最大利益
输入格式:
第一行是一个数字n
第二行有n个数字分别是1~n天的股票价格
输出格式:
输出你可以活得的最大利益
样例:
输入数据1:
9
10 5 4 7 9 12 6 2 10
输出数据1:
20
输入数据2:
20
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4
输出数据2:
41
设为第n天的股票价格,那么假设一对股票(假设一对股票分别为
)能够赚钱所需要满足的条件就是x>y且
,答案就是
的累加,但是
会有多个x和y的组合,而我们要求的就是
的最大值。
我们的做法是用优先队列来维护手上股票价格来计算盈利最大值,具体做法如下。
假设数据:
2 5 9 6
我们先将2压入队列,然后遇到5,5>2,那么假设我们就用5的价格去售卖,我们压入两个5,理由如下。
第一个5的意义是2升值为5,如果日后我们发现可以以大于5的价格(x)去售卖那么我们又在那一天将这支股票卖出,事实上就是对之前在5这一天卖出股票决策的“反悔”,在之后更高价格的点卖出,因为5>2,因此x-5<x-2,所以这样的决策是最优的,那么我们的获利sum=x-5+5-2=x-2。
对于第二个5的使用条件必须是第一个5已经被使用,那么如果可以指向第二个5被使用说明我们并没有在这一天卖出股票而是假设买入股票(因为如果后期这个股票留在优先队列里面说明它并没有让我们赚钱,所以就不买它)。并且计算在之后的股票交易当中我们是否能够获利(即重复2的操作)
通过反复以上操作于是我们就可以得出正确答案了。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,x,ans;
priority_queue<int,vector<int>,greater<int> > q;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
if(!q.empty()&&x>q.top())
{
q.push(x);
q.push(x);
ans+=x-q.top();
q.pop();
}
else
{
q.push(x);
}
}
cout<<ans<<endl;
}
注:本篇博客仅用于个人学习梳理思路,不存在抄袭盈利行为!!!(来自对互联网世界深深的恐惧)