题目描述

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. 使用Flask-SQLAlchemy管理数据库

    SQLAlchemy 是一个很强大的关系型数据库框架,处于数据库抽象层 ,支持多种数据库后台. 提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能. 安装Flask-SQLAlchemy ...

  2. 安装iis8

    -------------------- @echo off     echo 正在添加IIS8.0 功能,依据不同的网络速率,全程大约需要5分钟时间...     start /w pkgmgr / ...

  3. Beta版本敏捷冲刺每日报告——Day2

    1.情况简述 Beta阶段第二次Scrum Meeting 敏捷开发起止时间 2017.11.3 08:00 -- 2017.11.3 22:00 讨论时间地点 2017.11.3晚9:00,软工所实 ...

  4. 学号:201621123032 《Java程序设计》第5周学习总结

    1:本周学习总结 1.1: 写出你认为本周学习中比较重要的知识点关键词 接口interface,comparator接口和comparable接口. 1.2:尝试使用思维导图将这些关键词组织起来. 2 ...

  5. SQL数据库开发中的一些经典代码

    1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as  2.数据库加密: ...

  6. Twisted UDP编程技术

    实战演练1:普通UDP UDP是一种无连接对等通信协议,没有服务器和客户端概念,通信的任何一方均可通过通信原语直接和其他方通信 1.相对于TCP,UDP编程只需定义DatagramProtocol子类 ...

  7. ajax的四种type类型

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  8. LeetCode & Q26-Remove Duplicates from Sorted Array-Easy

    Descriptions: Given a sorted array, remove the duplicates in place such that each element appear onl ...

  9. 新概念英语(1-101)A Card From Jimmy

    Lesson 101 A card from Jimmy 吉米的明信片 Listen to the tape then answer this question. Does Grandmother s ...

  10. SpringCloud的服务注册中心(三) - 进一步了解 Eureka

    一.服务治理参与者 服务注册中心: eureka-server 服务提供者:HELLO-SERVICE 服务消费者 :HELLO-CONSUMER 很多时候,客户端既是服务提供者又是服务消费者,-&g ...