题目描述

applepi 训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi 写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。applpie 收集了“塞帕思股份(surpass)”在最近的连续 N 天内的价格。在每一天中,他可以做如下事情之一:
1. 睡(把)觉(妹)。
2. 以当天的价格作为成交价买入 1 股“塞帕思”的股票。
3. 以当天的价格作为成交价卖出 1 股“塞帕思”的股票。
最初 applepi 不持有该股票。现在你需要计算出在最优策略下,N 天后 applepi能够获得的最大利润。为了维护森林的和平,本着清仓甩锅的原则,在 N 天的交易结束后 applepi 也不能持有“塞帕思”的股票。

输入

每个测试点包含若干组数据。对于每组数据:
第一行 1 个整数 N。
第二行 N 个正整数,相邻两个整数之间用 1 个空格隔开,表示每一天股票的价格。

输出

对于每组数据,首先按样例所示的格式“Case #k:”输出该组数据的编号,然后输出一个整数,表示 applepi 最大能够获得的利润。

样例输入

6 2 6 7 3 5 6 8 1 2 3 4 5 6 7 8

样例输出

Case #1: 8
Case #2: 16

提示

样例输入 2

10
15831 47573 60015 51368 32460 34125 43074 75172 54014 93578
样例输出 2
Case #1: 161084
 

对于 50%的数据,1≤N≤1000。
对于 100%的数据,1≤N≤100000,股票价格不超过 100000,每个测试点至多包含 5 组数据。
 
题解:
这题正解好巧妙:
是个人都知道:如果当前已经买了一股,那么就要卖到最大的一天.
->但是我们并不知道那一天最大.
->于是我们在能产生利润时就卖掉.
->但是我们需要一个“后悔”操作,表示那天不卖,在此时利润更大时再买.
 
于是开个小根堆表示已经买了的股票.
当输入小于堆顶说明产生不了利益,先买掉
当输入大于堆顶说明可以产生利润,于是卖掉,并且把当天股价加入堆中两次(可以达到“后悔”的效果)
 
下面是”后悔“操作的原理:
假设堆顶是第a天的报价,当前是第b的的报价,第a天买进的股票应该在第c天卖出,
第b天买进的股票需要在第d天卖出,
a<b<c<d,收益p[c]-p[a]+p[d]-p[b]
现在把第a天的股票在第b天抛出,p[b]-p[a],然后又买进第b天的股票,那么在第c天的时候,
堆顶为第b天的股票,抛出第b天的股票 p[c]-p[b],收益总和p[b]-p[a]+p[c]-p[b]=p[c]-p[a]
但因为第b天的股票应该在第d天抛出,所以要第二次再次买进第b天的股票
 
下面来分析具体含义:
1.假如一个元素被取出一次,说明当天既没买也没卖(睡觉)
2.假如取出了两次,说明确实是卖掉了.
3.加入一个元素没有被取出过,相当于在当天买了.
 
为什么答案满足最大:
1.买入的都是没有被取出过的,因为是小根堆,所以满足最大.
2.同理卖出的都是最小的.
3.又因为是按i=1-n处理的所以满足买卖顺序.
下面是代码:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int n;
int gi(){
int str=;char ch=getchar();
while(ch>'' || ch<'')ch=getchar();
while(ch>='' && ch<='')str=str*+ch-'',ch=getchar();
return str;
}
int cnt=;
int t[],num=;
void putin(int x)
{
t[++num]=x;
int now=num,next;
while(now>)
{
next=(now>>);
if(t[now]>=t[next])break;
swap(t[now],t[next]);
now=next;
}
} int getit()
{
int str=t[];
t[]=t[num--];
int now=,next;
while((now<<)<=num)
{
next=now<<;
if(t[next]>t[next+] && next<num)next++;
if(t[now]<=t[next])break;
swap(t[now],t[next]);
now=next;
}
return str;
} void work()
{
cnt++;
int x,tmp;long long ans=;
for(int i=;i<=n;i++)
{
x=gi();
if(!num || t[]>=x)putin(x);
else
{
tmp=getit();
ans+=x-tmp;
putin(x);
putin(x);
}
}
printf("Case #%d: %lld\n",cnt,ans);
}
int main()
{
while(~scanf("%d",&n)){
work();
num=;
}
}

【LSGDOJ1836】: 量化交易 贪心的更多相关文章

  1. 3. 量化交易策略 - https://github.com/3123958139/blog-3123958139/README.md

    3. 量化交易策略 * 输入数据 - 只取最原始可靠的,如 * date * open * high * low * close * volume * 输出数据 - 根据数理统计取权重,把 o, h, ...

  2. 深度神经网络在量化交易里的应用 之二 -- 用深度网络(LSTM)预测5日收盘价格

        距离上一篇文章,正好两个星期. 这边文章9月15日 16:30 开始写. 可能几个小时后就写完了.用一句粗俗的话说, "当你怀孕的时候,别人都知道你怀孕了, 但不知道你被日了多少回 ...

  3. python做量化交易干货分享

    http://www.newsmth.NET/nForum/#!article/Python/128763 最近程序化交易很热,量化也是我很感兴趣的一块. 国内量化交易的平台有几家,我个人比较喜欢用的 ...

  4. Python量化交易

    资料整理: 1.python量化的一个github 代码 2.原理 + python基础 讲解 3.目前发现不错的两个量化交易 学习平台: 聚宽和优矿在量化交易都是在15年线上布局的,聚宽是15年的新 ...

  5. 金融量化分析【day112】:初识量化交易

    一.摘要 为什么需要量化交易? 量化交易是做什么? 量化交易的价值何在? 做量化交易需要什么? 聚宽是什么? 零基础如何快速入门量化交易? 自测与自学 二.量化交易比传统交易强多少? 它能让你的交易效 ...

  6. 金融量化分析【day112】:量化交易策略基本框架

    摘要 策略编写的基本框架及其实现 回测的含义及其实现 初步学习解决代码错误 周期循环的开始时间 自测与自学 通过前文对量化交易有了一个基本认识之后,我们开始学习做量化交易.毕竟就像学游泳,有些东西讲是 ...

  7. zw量化交易·实盘操作·系列培训班

    参见: <zw量化交易·实盘操作·系列培训班> http://blog.sina.com.cn/s/blog_7100d4220102w0q5.html

  8. Python进阶量化交易专栏场外篇7- 装饰器计算代码时间

    欢迎大家订阅<教你用 Python 进阶量化交易>专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前已推出如下扩展篇: 在第一篇 ...

  9. Python进阶量化交易场外篇5——标记A股市场涨跌周期

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

随机推荐

  1. 201621123060《JAVA程序设计》第三周学习总结

    1. 本周学习总结 1.1写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等. 关键词:类.方法.属性.对象.多态.继承.封装.面向对象.> 1.2 用思维导图或者Onenote或其 ...

  2. js日常积累

    1.数组转字符串 str.join(',') 2.字符串转数组 arr.split(',') 3.数组排序 function sorb(a,b){return a-b;}; arr.sort(sorb ...

  3. Flask学习 二 模板

    jinja2模版 from flask import Flask,render_template app = Flask (__name__) @app.route ('/<name>') ...

  4. DML数据操作语言之增加,删除,更新

    1.数据的增加 数据的增加要用到insert语句  ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...

  5. Python内置函数(10)——float

    英文文档: class float([x]) Return a floating point number constructed from a number or string x. If the ...

  6. TCP/IP和HTTP协议代理

    TCP/IP协议族 TCP/IP(传输控制协议/网际协议)是用于计算机通信的一个协议族. TCP/IP协议族包括诸如Internet协议(IP).地址解析协议(ARP).互联网控制信息协议(ICMP) ...

  7. SpringCloud的服务注册中心(一)

    一.概念和定义 1.服务治理:服务注册与服务发现 服务注册中心,提供服务治理功能,用来实现各个微服务实例的自动注册与发现. 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,维护人员就不需 ...

  8. 新概念英语(1-63)Thank you, doctor.

    新概念英语(1-63)Thank you, doctor. Who else is in bed today? why? A:How's Jimmy today? B:Better. Thank yo ...

  9. Spring Security入门(1-13)Spring Security的投票机制和投票器

    1.三种表决方式,默认是 一票制AffirmativeBased public interface AccessDecisionManager { /** * 通过传递的参数来决定用户是否有访问对应受 ...

  10. leetcode算法: Find Largest Value in Each Tree Row

    '''You need to find the largest value in each row of a binary tree.Example:Input: 1 / \ 3 2 / \ \ 5 ...