当前位置: 代码迷 >> 综合 >> 51nod 2206 低买高卖codeforces867E Buy Low Sell High 贪心+优先队列
  详细解决方案

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

热度:24   发布时间:2024-01-15 06:29:32.0

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

 

  相关解决方案