loj2353. 「NOI2007」 货币兑换
loj2353. 「NOI2007」 货币兑换
链接
思路
题目不重要,重要的是最后一句话
提示
必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币;每次卖出操作卖出所有的金券。
所以f[i]表示第i天最大收益
设第i天把m元换成券(A券rate[i]*x个,B券x个),则\(a[i]*rate[i]*x+b[i]*x=m\)
\(x=\frac{m}{a[i]*rate[i]+b[i]}\)就可以算出来A券和B券了
根据提示,就可以把一天的所有钱都换掉
设x[j]=f[j]换成A券个数,y[j]=f[j]换成B券的个数(他们只跟j有关)
\(f[i]=a[i]*x[j]+b[i]*y[j]\)
\(\frac{f[i]}{b[i]}=\frac{a[i]}{b[i]}*x[j]+y[j]\)
\(y[j]=-\frac{a[i]}{b[i]}*x[j]+\frac{f[i]}{b[i]}\)
cdq进行dp维护凸包
代码
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-9;
const int N=2e5+7;
int n,stak[N];
struct node {
double a,b,rate,k,x,y;
int id;
bool operator < (const node &b) const {
return k>b.k;
}
}p[N],t[N];
double f[N];
double get_k(int a,int b) {
if(!b) return -1e20;
if(fabs(p[a].x-p[b].x)<eps) return 1e20;
return (p[b].y-p[a].y)/(p[b].x-p[a].x);
}
void cdq(int l,int r) {
if(l==r) {
f[l]=max(f[l],f[l-1]);
p[l].x=p[l].rate*(f[l]/(p[l].a*p[l].rate+p[l].b));
p[l].y=f[l]/(p[l].a*p[l].rate+p[l].b);
return;
}
int mid=(l+r)>>1;
int l1=l,l2=mid+1;
for(int i=l;i<=r;++i) {//sort p according to id
if(p[i].id<=mid) t[l1++]=p[i];
else t[l2++]=p[i];
}
for(int i=l;i<=r;++i) p[i]=t[i];
cdq(l,mid);//solve left half
int top=0;
for(int i=l;i<=mid;++i) {
while(top>1&&get_k(stak[top-1],stak[top])<get_k(stak[top-1],i)+eps) top--;
stak[++top]=i;
}//get the upper convex hull
stak[++top]=0;
int j=1;
for(int i=mid+1;i<=r;++i) {
while(j<top&&get_k(stak[j],stak[j+1])+eps>p[i].k) j++;
f[p[i].id]=max(f[p[i].id],p[i].a*p[stak[j]].x+p[i].b*p[stak[j]].y);
}//use left hull to update right ans
cdq(mid+1,r);//continue
l1=l,l2=mid+1;
for(int i=l;i<=r;++i) {//sort p according to x
if(((p[l1].x<p[l2].x||(fabs(p[l1].x-p[l2].x)<eps&&p[l1].y<p[l2].y)||l2>r))&&l1<=mid)
t[i]=p[l1++];
else
t[i]=p[l2++];
}
for(int i=l;i<=r;++i) p[i]=t[i];
}
int main() {
scanf("%d%lf",&n,&f[0]);
for(int i=1;i<=n;++i) {
scanf("%lf%lf%lf",&p[i].a,&p[i].b,&p[i].rate);
p[i].k=-p[i].a/p[i].b;
p[i].id=i;
}
sort(p+1,p+1+n);
cdq(1,n);
printf("%.3lf",f[n]);
return 0;
}
loj2353. 「NOI2007」 货币兑换的更多相关文章
- 「NOI2007」 货币兑换
「NOI2007」 货币兑换 题目描述 小 Y 最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A 纪念券(以下简称 A 券)和 B 纪念券(以下简称 B 券).每个持有金券的顾客都有一个自 ...
- loj#2353. 「NOI2007」 货币兑换 斜率优化
题意略 题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i] ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
随机推荐
- VUE组件的学习
参考:https://blog.csdn.net/baidu_23142899/article/details/79130225
- mybits根据表自动生成 java类和mapper 文件
mybits根据表自动生成 java类和mapper 文件 我这个脑子啊,每次创建新的工程都会忘记是怎么集成mybits怎么生成mapper文件的,so today , I can't write t ...
- 主流框架的搭建(VUE,React)
vue脚手架:cnpm install vue vue-cli -gvue init webpack/webpack-simple shuaige(新建文件夹的名字)cd shuaigecnpm in ...
- 安装配置Spark集群
首先准备3台电脑或虚拟机,分别是Master,Worker1,Worker2,安装操作系统(本文中使用CentOS7). 1.配置集群,以下步骤在Master机器上执行 1.1.关闭防火墙:syste ...
- CentOS 7.6 安装 Weblogic 12
http://download.oracle.com/otn/nt/middleware/12c/12213/fmw_12.2.1.3.0_wls_Disk1_1of1.zip java -jar f ...
- en-zh(社会问题)social problems-2
让屏幕代替父母陪孩子?世卫组织:这样是不对的! No sedentary screen time for babies, WHO says Babies and toddlers should not ...
- 树莓派3 之 安装Mysql服务
需求 在树莓派上 安装Mysql 服务,并开启远程访问 步骤 安装 mysql server $ sudo apt-get install mysql-server 我以为中间会让我提示输入 数据库r ...
- LaTeX参考文献出现问号
自己用LaTeX编辑,忘记在\end{document}前面放: \bibliographystyle{ieeetr}\bibliography{sample-bibliography} 导致这个现象 ...
- python框架之Django(10)-Form组件
介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...
- 算数运算符: + - * / //(地板除) %(取余) **(幂运算) / 比较运算符 > < >= <= == !=
# ### python运算符 #(1) 算数运算符: + - * / //(地板除) %(取余) **(幂运算) var1 = 5 var2 = 8 # +res = var1 + var2 pri ...