【51Nod - 2206】 低买高卖 (贪心&优先队列 详解)

51Nod - 2206

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

Input

第一行一个整数n表示天数。(1 <= n <= 200000,1 <= a[i] <= 10000) 接下来一行n个整数,表示每天的价钱。

Output

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

Sample

InputcopyOutputcopy
9
10 5 4 7 9 12 6 2 10
20

解题思路:将数据存入优先队列里面,因为队头开始,数据是从小到大排序存入的,然后我们就去把数据对对头进行比较,如果小于对头的话就存进去,大的话,就说明我们如果买对头的那个股票的话,会给我们带来利润,然后再把这个这个大于对头的数据存两次放在优先队列里面,其中一个是代表我们可能会买这个股票(后面有股票卖的价钱比这个高),另一个代表的是一个中间值,就比如你买A卖B,买B卖C 跟你买A卖C是一样的。这个时候就相当于我们买的是队头的股票,卖的是和它对比比它价钱高的股票,然后我们用一个数据存利润差,因为我们已经把对头买了,所以我们就要把它移除队列 (注意,我们是现算利润差,再删除对头,顺序乱的话就没有办法存利润差了)

AC

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;//队列里面的数据自动从小到大排序
int main(void)
{
	int n,x,sum=0;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&x);
		if(!q.empty()&&x>q.top())
		{
			sum+=x-q.top();
			q.pop();
			q.push(x);
			q.push(x);
			
		 } 
		 else
		 {
		 	q.push(x);
		 }	
	}
	cout<<sum<<endl;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值