考虑股票市场,一共有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<bits/stdc++.h>
using namespace std;
#define N 200005
typedef long long ll;
priority_queue <int, vector<int>, greater<int>> 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);}elseq.push(num);}printf("%lld\n", sum);}
}