Codeforces Round #437 Div. 2 E. Buy Low Sell High

Description

You can perfectly predict the price of a certain stock for the next N days. You would like to profit on this knowledge, but only want to transact one share of stock per day. That is, each day you will either buy one share, sell one share, or do nothing. Initially you own zero shares, and you cannot sell shares when you don’t own any. At the end of the N days you would like to again own zero shares, but want to have as much money as possible.

Input

Input begins with an integer N (2 ≤ N ≤ 3·105), the number of days.

Following this is a line with exactly N integers p1, p2, …, pN (1 ≤ pi ≤ 106). The price of one share of stock on the i-th day is given by pi.

Output

Print the maximum amount of money you can end up with at the end of N days.

Examples

input
9
10 5 4 7 9 12 6 2 10
output
20
input
20
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4
output
41

题目大意

数据给出第n天的股票价格,你可以在某一天买入一个股票或者卖出一个股票或者什么都不做,问最大的获益是多少。

解题思路

用小顶堆来维护每天股票的价格,当堆顶元素小于插入的当日股票价格时,则将该股票卖出,盈利为差价。将当日股票价格插入两次是因为一次作为当天买入股票,另一次作为中转价格保存,比如第1天买入2元的股票,第3天股票价格为4元,则将2元股票卖出盈利2元,然后第4天股票价格为7元,则将4元股票卖出盈利3元,此时相当于第1天买入股票然后再第4天卖出,盈利5元。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define ll long long
priority_queue<int,vector<int>,greater<int> >qu;
int main()
{
    int n,t;
    ll ans;
    while(~scanf("%d",&n))
    {
        ans=0;
        scanf("%d",&t);
        qu.push(t);
        for(int i=1;i<n;i++)
        {
            scanf("%d",&t);
            if(t>qu.top())
            {
                ans+=(t-qu.top());
                qu.pop();
                qu.push(t);
                qu.push(t);
            }
            else
                qu.push(t);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值