NSFZOJ #6033. 买股票

NSFZOJ #6033. 买股票
题目描述

蒟蒻预测了某支股票后nnn天的价格,其中第i天股价为pip_ipi,他打算利用这个赚钱。由于他实在太懒了,每天他至多只会交易1股(也就是说,他每天可以买进一股,卖出一股,或者什么都不做)。蒟蒻最开始不拥有任何股票,他希望nnn天后同样不拥有任何股票,并且赚最多的钱。他希望你帮他计算最多能赚多少钱。

输入格式

第一行一个数nnn,代表天数。

第二行nnn个数,第i个数为pip_ipi

输出格式

一个整数,表示最多赚多少钱。

样例
样例输入 1
10
1 1 1 1 2 2 2 2 2 2
样例输出 1
4
样例输入 2
9
10 5 4 7 9 12 6 2 10
样例输出 2
20
数据范围与提示

对于40%40\%40%的数据,n≤3000n\le3000n3000

对于100%100\%100%的数据,2≤n≤3000002\le n \le 3000002n300000 , 1≤pi≤1∗1061\le p_i\le 1*10^61pi1106

题目来源:CF866D

链接:http://codeforces.com/contest/866/problem/D


AC了以后才发现,这道题40分比100分难写,但容易想到(对我来说)。40分:DP,就不详细说了,还要加优化。

注意到对于一个股票,当天不买等价于当天买了再卖,因此可以假设当天卖了,然后如果要买回来还可以弥补。即每天先卖,然后取之前所有可以买的中最便宜的与他交易,赚差价。这里用堆来维护即可,这个思想其实不少见,以前有一道题说的是一条路上有几个加油站,每个加油站可以加固定数量的油,而汽车油箱无限大,问至少要加几次,其实每次经过一个加油站就->等价于获得了一次加油的机会,以后什么时候用都可以<-。这里也一样,每次卖完就获得了两次(因为还可以只买不卖)再买它的机会,每次挑最优的股票赚差价,这就是贪心之处、


代码


补充说明:任意一次买卖都必须是选两个日期,买前者卖后者,尽管题目条件是每天只能买或卖至多一次,但是我们可以不用管(为啥??)。因为你如果在某一天先卖了,又在之后买了,相当于没买也没卖,而两次买卖相当于首尾相接只留下前者买入的和后者卖出的。即a->b,b->c  <==>  a->c。因此有了贪心的策略。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值