Buy low sell high

题目大意如下

你可以预测未来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;
} 

借鉴博客:https://blog.csdn.net/qq_42873341/article/details/85013364?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167396149616800182766064%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167396149616800182766064&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-85013364-null-null.142^v71^wechat_v2,201^v4^add_ask&utm_term=Buy%20Low%20Sell%20High&spm=1018.2226.3001.4187

注:本篇博客仅用于个人学习梳理思路,不存在抄袭盈利行为!!!(来自对互联网世界深深的恐惧)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值