【51Nod】2206 低买高卖

考虑股票市场,一共有n天。
对于第i天,B君知道股票的价格是每单位a[i]元
在每一天,B君可以选择买入一个单位的股票,卖出一个单位的股票,或者什么都不做。
刚开始B君有无穷多的钱,但是没有任何股票。
问n天之后B君最多可以赚多少钱。
(1 <= n <= 200000)
(1 <= a[i] <= 10000)

 收起

输入

第一行一个整数n表示天数。
接下来一行n个整数,表示每天的价钱。

输出

一行一个整数表示最多可以赚的钱数。

输入样例

9
10 5 4 7 9 12 6 2 10

输出样例

20

 

思路:这个题目看起来是很眼熟的了,因为之前都是做的手中最多可以有1只股票的,但是这个是可以有很多股票的就有所不同了,

通过上次的做手中最多可以有一支股票的题目我们可以发现,当你手上的这支股票在价格上升的期间内合理买入卖出的时候,只要是能挣钱的合理的,最终的结果都是一样的(即一开始买入,顶峰时期卖出,和遇到上升直接买入卖出),满足贪心策略,

那么我们就可以选择一种做法,就是如果某一天的股票就是当前的最便宜的价格,那么我只在优先队列中设置一次即可,如果不是,那么我就要设置两次这个价格,

其中设置一次的大家都懂,即过了这个村就没这店儿了,

那么设置两次的呢?

    可以理解为,我在那一天的时候选择了卖出,因为最小的价格不是他,换句话说在这一天我是能够盈利的,那么我选择了卖出,我们这里假设最小价格是a 这一天的价格是p 这一天的盈利是 p-a;

   那么如果当某一天,p成为了当前队列中的最小价格,我们假设当前的价格为s,那么今天的我要盈利,这一天的盈利是s-p,这时把总的盈利加起来是不是相当于我在价格为p的时候的那一天啥也没干,而且我也是本来两个p用掉了一个,

  如果某一天这个p又成为了最小的价格,当前的价格为m吧,那么我今天的盈利也就是m-p最终的盈利也就是m+s-p-a,其中价格p也没了,a也早就没了

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int maxn=2e5+10;
int n;
ll ans;
int main()
{
    scanf("%d",&n);
    ans=0;
    priority_queue< int,vector< int>,greater< int> >Q;
    for(int i=1;i<=n;i++)
    {
        int x;scanf("%d",&x);
        Q.push(x);
        Q.push(x);
        ans+=x-Q.top();
        Q.pop();
    }
    printf("%lld\n",ans);
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值