51nod 2206 低买高卖&codeforces867E Buy Low Sell High 贪心+优先队列

考虑股票市场,一共有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

 

分析:

这题的解法比较妙,这题最大的限制就是当前有一个最小值:x,你无法O(1)确定y,只能循环的走一遍,但肯定会超时,这里有一个很巧妙的解决方法,

比如:

1 4 10 3

直接选1买10卖是最好解决方法

或者还有一个方法: 1买 4卖 4买 10卖(当然在题意中是不合法的,但代价与1买10卖

所以我们用一个优先队列维护最小值,只要遇到比最小值大的值y,就把最小值剔除,压入两遍y。

 

 

#include
using namespace std;
#define N 200005
typedef long long ll;
priority_queue , greater> q;
int main()
{
	ll n;
	while (scanf("%lld", &n) != EOF)
	{
		ll sum = 0;
		while (!q.empty())
		{
			q.pop();
		}
		ll num;
		while (n--)
		{
			scanf("%lld", &num);
			if (!q.empty()&&num > q.top()) 
			{
				sum += num - q.top(); 
				q.pop();
				q.push(num);
				q.push(num);
			}
			else
				q.push(num);
		}
		printf("%lld\n", sum);
	}
}

 

你可能感兴趣的:(好题,算法基础--贪心算法,数据结构--队列)