Description
某人在炒股,有A,B两种股票,第天买卖一单位A、B股需,元。每天可以多次操作,每次可以卖出手里op%的A和B股,或者买进数量的A、B两种股票。问第天手里最多的股票。
Solution
1.题面末端给了提示:要么用光手里的钱买,要么卖完手里所有的股票
2.对于多次操作,因为每天无论买卖交易同一种股票都是一个价钱,不会对该天股票又买又卖。因此顶多会出现先卖(一开始手里有的)后买,然后该天结束。
这样op=100,且知道当时手里的钱是可以利用比例推出分别可以卖的A、B股票数。
这样每天三种决策(不动/买/卖),维护当天手里最多的钱。
不动:
发现买可以由推出。因此只用考虑卖。
卖:决策前面买入股票的那天。懒得写柿子了具体见:luogu题解
总之式子可以推出关于的,斜率和截距跟有关的直线。
用超哥线段树。不然还要写cdq/平衡树优化+斜率优化,嘿嘿……
easy code
戳我
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e6+5;
int id,bst[N];
db c[N],d[N],k[N],b[N],A[N],B[N],C[N];
db F(int p,int x) {return c[x]*k[p]+b[p];}
void Update(int x,int l,int r) {
if(l==r) {
if(F(bst[x],l)<F(id,l)) bst[x]=id;
return;
}
int mid=(l+r)>>1;
if(F(bst[x],mid)<F(id,mid)) swap(bst[x],id);
if(F(bst[x],l)<F(id,l))Update(x<<1,l,mid);
else if(F(bst[x],r)<F(id,r))Update(x<<1|1,mid+1,r);
}
int X;
db Query(int x,int l,int r) {
if(l==r) return bst[x]?F(bst[x],X):0;
int mid=(l+r)>>1;
return max(!bst[x]?0.0:F(bst[x],X),(X<=mid?Query(x<<1,l,mid):Query(x<<1|1,mid+1,r)));
}
int main() {
int n;db f,g;
scanf("%d%lf",&n,&f);
for(int i=1;i<=n;i++) {
scanf("%lf%lf%lf",&A[i],&B[i],&C[i]);
c[i]=d[i]=1.0*A[i]/B[i];
}
sort(c+1,c+1+n);
for(int i=1;i<=n;i++) {
id=i;
X=lower_bound(c+1,c+1+n,d[i])-c;f=max(f,B[i]*Query(1,1,n));
g=A[i]*C[i]+B[i];b[i]=f/g;k[i]=b[i]*C[i];Update(1,1,n);
}
printf("%.3lf",f);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2021-04-24 二分图基础习题