https://www.51nod.com/contest/Problem.html#!problemId=2206&contestId=54
低买高卖
基准时间限制:1 秒 空间限制:131072 KB 分值: 5
考虑股票市场,一共有n天。
对于第i天,B君知道股票的价格是每单位a[i]元
在每一天,B君可以选择买入一个单位的股票,卖出一个单位的股票,或者什么都不做(持有)。
刚开始B君有无穷多的钱,但是没有任何股票。
问n天之后B君最多可以赚多少钱。
(1 <= n <= 200000)
(1 <= a[i] <= 10000)
Input
第一行一个整数n表示天数。 接下来一行n个整数,表示每天的价钱。
Output
一行一个整数表示最多可以赚的钱数。
Input示例
9
10 5 4 7 9 12 6 2 10
Output示例
20
AC代码
//卖比买赚钱,假设每天都在卖(那么每天都在赚钱)
//不妨假设每到新的一天,都把当天的股票卖掉
//那因为现在一点股票都没有,所有至少有一天要买入,
//那就需要在今天或今天的前某天把其当天的卖出改成持有,或者持有改成买入
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
int main(int argc, char** argv) {
priority_queue<int>q;//大根堆
int n;
scanf("%d",&n);
int x;
ll z=0;
for(int i=0;i<n;i++){
scanf("%d",&x);//读入卖出收益
q.push(-x);
q.push(-x);
ll tmp=x+q.top();//净利润=卖出收益-买入成本(最小成本) -10 -5 -4 -4 -5 -7 -6 -2 -2
//printf("%lld ",tmp); //每天的净利润
z+=tmp;
q.pop();
}
printf("\n%lld\n",z);
return 0;
}