卧薪尝胆,厚积薄发。
Buy Low Sell High
Date: Thu Sep 20 21:31:21 CST 2018 In Category: NoCategory

Description:

给出 $n$ 天的股票价格,每天可以买进一只股或者卖出一只股,问最大收益。
$1\le n \le 3\times 10^5$

Solution:

每次把负的当天价格放进堆里,代表如果在这一天买会损失 $-v[i]$ 元,如果 $v[i]+$ 堆顶 $>0$ ,说明能构成一个赚钱的交易, $ans|=v[i]+q.top()$ ,然后再把一个 $-v[i]$ 元放回堆里,因为 $b-a+c-b=c-a$ ,所以相当于再买一个使得相当于没有进行这次操作。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
priority_queue<int> q;
int x;
long long ans = 0;
for(int i = 1;i <= n;++i)
{
scanf("%d",&x);
q.push(-x);
if(!q.empty() && x + q.top() > 0)
{
ans += x + q.top();q.pop();
q.push(-x);
}
}
cout << ans << endl;
return 0;
}
In tag: 算法-贪心
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡