考虑股票市场上的某一只股票,一共有 nn 天。
对于第 ii 天,BB 君知道股票的价格是每单位 a[i]a[i] 元
在每一天,BB 君可以选择买入一个单位的股票,或卖出一个单位的股票,或者什么都不做。
刚开始 BB 君有无穷多的钱,但是没有任何股票。问 nn 天之后 BB 君最多可以赚多少钱。
Input
第一行一个整数n表示天数。(1 <= n <= 200000,1 <= a[i] <= 10000) 接下来一行n个整数,表示每天的价钱。
Output
一行一个整数表示最多可以赚的钱数。
Sample
Inputcopy | Outputcopy |
---|---|
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;
}