P2569 [SCOI2010]股票交易
最近 \(lxhgww\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律。
通过一段时间的观察,\(lxhgww\) 预测到了未来 \(T\) 天内某只股票的走势,第 \(i\) 天的股票买入价为每股 \(AP_i\),第 \(i\) 天的股票卖出价为每股 \(BP_i\)(数据保证对于每个 \(i\),都有 \(AP_i \geq BP_i\)),但是每天不能无限制地交易,于是股票交易所规定第 ii 天的一次买入至多只能购买 \(AS_i\) 股,一次卖出至多只能卖出 \(BS_i\) 股。
另外,股票交易所还制定了两个规定。为了避免大家疯狂交易,股票交易所规定在两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔 \(W\) 天,也就是说如果在第 \(i\) 天发生了交易,那么从第 \(i+1\) 天到第 \(i+W\)天,均不能发生交易。同时,为了避免垄断,股票交易所还规定在任何时间,一个人的手里的股票数不能超过 \(MaxP\)。
在第 11 天之前,\(lxhgww\) 手里有一大笔钱(可以认为钱的数目无限),但是没有任何股票,当然,\(T\) 天以后,\(lxhgww\) 想要赚到最多的钱,聪明的程序员们,你们能帮助他吗?
输入输出格式
输入数据第一行包括 33 个整数,分别是 \(T\),\(\text{MaxP}\),\(W\)。
接下来 \(T\) 行,第 \(i\) 行代表第 \(i-1\)天的股票走势,每行 \(4\) 个整数,分别表示 \(AP_i,\ BP_i,\ AS_i,\ BS_i\)
输出数据为一行,包括 \(1\) 个数字,表示 \(lxhgww\) 能赚到的最多的钱数。
5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1
3
说明
对于 \(30\%\) 的数据,\(0\leq W<T\leq 50,1\leq\text{MaxP}\leq50\)
对于 \(50\%\) 的数据,\(0\leq W<T\leq 2000,1\leq\text{MaxP}\leq50\)
对于 \(100\%\) 的数据,\(0\leq W<T\leq 2000,1\leq\text{MaxP}\leq2000\)
对于所有的数据,\(1\leq BP_i\leq AP_i\leq 1000,1\leq AS_i,BS_i\leq\text{MaxP}\)
这题真的难,写了我两个小时。(也可以等效于我是真的菜)
不打算讨论题目的解题思路,就是单纯的讲一下这三天写单调队列的感受吧。
- 刚看到一个题目不用刻意去想是不是单调队列。
- 能用单调队列写的首先通常有一个复杂度爆炸的暴力。
- 其形式通常为一个包含多变量的明确的状态方程,有的变量可能会非常大。
- 单队特称明显,暴力转单调队列是自然而然的事情。
- 一开始跳过暴力直接写正解,很容易导致正确性出现问题。(除非题目很简单)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 2010
#define INF 0x7fffffff
using namespace std;
int h1,t1,h2,t2;
int n,m,w,ans,AP[MAXN],BP[MAXN];
int AS[MAXN],BS[MAXN],f[MAXN][MAXN];
struct node{
int nod,val;
}q1[MAXN],q2[MAXN];
int main(){
cin>>n>>m>>w;
for(register int i=1;i<=n;++i){
cin>>AP[i]>>BP[i]>>AS[i]>>BS[i];
}
memset(f,-0x3f,sizeof(f));f[0][0]=0;
for(register int i=1;i<=n;++i){//枚举当前哪一天
for(register int j=0;j<=m;++j){
if(j<=AS[i]){//如果一次购买可以达到j股
f[i][j]=max(f[i][j],f[0][0]-AP[i]*j);
}
f[i][j]=max(f[i][j],f[i-1][j]);//不作购买
}
h1=1,t1=0,h2=1,t2=0;
for(register int j=1;j<=m;++j){
if(i-w-1>0){
node ins;ins.nod=j-1;
ins.val=f[i-w-1][j-1]+AP[i]*(j-1);
while(h1<=t1 && q1[t1].val<=ins.val)t1--;
q1[++t1]=ins;
while(h1<=t1 && q1[h1].nod<j-min(j,AS[i]))h1++;
f[i][j]=max(f[i][j],q1[h1].val-AP[i]*j);
}
}
for(register int j=m-1;j>=0;--j){
if(i-w-1>0){
node ins;ins.nod=j+1;
ins.val=f[i-w-1][j+1]+BP[i]*(j+1);
while(h2<=t2 && q2[t2].val<=ins.val)t2--;
q2[++t2]=ins;
while(h2<=t2 && q2[h2].nod>j+min(m-j,BS[i]))h2++;
f[i][j]=max(f[i][j],q2[h2].val-BP[i]*j);
}
}
}
for(register int i=1;i<=n;++i){
for(register int j=0;j<=m;++j){
ans=max(ans,f[i][j]);
}
}
cout<<ans<<endl;
}
P2569 [SCOI2010]股票交易的更多相关文章
- 洛谷P2569 [SCOI2010]股票交易
P2569 [SCOI2010]股票交易 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股 ...
- [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)
P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...
- P2569 [SCOI2010]股票交易 dp 单调队列优化
LINK:股票交易 题目确实不算难 但是坑点挺多 关于初值的处理问题我就wa了两次. 所以来谢罪. 由于在手中的邮票的数量存在限制 且每次买入卖出也有限制. 必然要多开一维来存每天的邮票数量. 那么容 ...
- 洛谷 P2569[SCOI2010]股票交易(动规+单调队列)
//只能写出裸的动规,为什么会有人能想到用单调队列优化Orz 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测 ...
- 洛谷P2569 [SCOI2010]股票交易(单调队列)
传送门 惭愧……这种题目都没看出来…… 首先,我们用$dp[i][j]$表示在第$i$天,手上有$j$股时的最大收益 第一,我们可以直接买股票,即$dp[i][j]=-j*AP_i$,这个直接计算即可 ...
- Luogu P2569 [SCOI2010] 股票交易
此题链接到dp常见优化方法 开始的时候被纪念品误导,以为是多支股票,后来发现事情不妙: 这道题知道的是某一只股票的走势: \(Solution\): \(70pts\): 设\(f[i][j]\)表示 ...
- LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)
传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...
- 单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569
题面:P2569 [SCOI2010]股票交易 题解: F[i][j]表示前i天,目前手中有j股的最大收入Case 1:第i天是第一次购买股票F[i][j]=-j*AP[i]; (1<=j< ...
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
随机推荐
- git使用(2)
1.远程仓库 a SSHKEY 第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到 ...
- DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST
Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...
- IIS7开启gZip动态压缩
1.安装动态压缩模块: 安装过程可能的报错:This application has requested the Runtime to terminate it in an unusual way. ...
- Jquery Jquery对象和DOM对象的微妙联系
声明变量 var $variable= Jquery 对象: var varibake= DOM对象: var $cr= $("#id&q ...
- Delphi中的Sender:TObject对象解析
Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过 ...
- verilog 数据格式
基数格式(通常为无符号数)[size]'base value size常量的位数 base数制o:8 b:2 d:10 h:16 https://wenku.baidu.com/view/f63daa ...
- caffe配置NCCL
设置Makefile.config 打开开关: USE_NCCL := 1, 并添加nccl库路径 USE_NCCL := 1 INCLUDE_DIRS += /path/nccl/build/inc ...
- gbk、utf-8、utf8mb4区别
1. 存储大小(1). GBK编码专门用来解决中文编码的,是双字节的.不论中英文都是双字节的.(2). UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用2 ...
- BZOJ4946 NOI2017蔬菜(贪心+堆)
容易想到一个费用流做法:将每种蔬菜拆成p种,对应p个过期时间,每一种向可以卖的时间连边,第一次卖的奖励算在最晚过期的一种里.对于天数动态加点.不过这样边数太多了,因为第i天能卖的第i-1天一定能卖,可 ...
- MT【17】利用柯西不等式求三角的最大值
评:此题也可以设$1+cos\theta=t$,平方后变成$t$的单变量利用均值去做. 柯西平衡系数法其实就是待定系数法,利用等号取到的条件.