loj2353. 「NOI2007」 货币兑换

链接

https://loj.ac/problem/2353

思路

题目不重要,重要的是最后一句话

提示

必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币;每次卖出操作卖出所有的金券。

所以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」 货币兑换的更多相关文章

  1. 「NOI2007」 货币兑换

    「NOI2007」 货币兑换 题目描述 小 Y 最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A 纪念券(以下简称 A 券)和 B 纪念券(以下简称 B 券).每个持有金券的顾客都有一个自 ...

  2. 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] ...

  3. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  4. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  5. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  6. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  7. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  8. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  9. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

随机推荐

  1. 关于c++深拷贝与浅拷贝

    首先看一段代码: #include<iostream> #include<cstring> #include<malloc.h> using namespace s ...

  2. Broadcast

    静态注册广播接收器 1. 活动中创建内部类继承BroadcastReceiver实现 onReceive函数 2. new 一个内部类的对象 3. registerReceiver注册内部类 4. 在 ...

  3. UML关系实现、泛化,依赖、组合

    图片via<大话设计模式> UML一目了然

  4. sonarqube安装的坑

    1.按照官网安装 结果启动不了,看了log日志以后,发现是es报错,不能以root权限启动

  5. java_Arrays.sort()方法

    这个方法位于util包里,可以传入任一类型数组,默认按照字典序升序排序 如果要按照降序排序,直接写一个循环来颠倒顺序就好了 源码如下 String[] name = {"1",&q ...

  6. java8新特性--Stream的基本介绍和使用

    什么是Stream? Stream是一个来自数据源的元素队列并可以进行聚合操作. 数据源:流的来源. 可以是集合,数组,I/O channel, 产生器generator 等 聚合操作:类似SQL语句 ...

  7. Jenkins在windows服务器上依赖的maven仓库目录

    1.在windows server 2008上,maven仓库路径为: C:\Users\用户名\.m2 2.在windows server 2003上(加入域的服务器),maven仓库路径为: C: ...

  8. Git命令行基本操作

    Git--- download网址:https://git-scm.com/downloads 0. 安装Git 网上有很多Git安装教程,如果需要图形界面,windows下建议使用TortoiseG ...

  9. 实验二《Java面向对象程序设计》的一点说明

    实验二<Java面向对象程序设计>的一点说明 本周的实验要求是: 完成实验二<Java面向对象程序设计>中的内容 其中Eclipse相关的内容参考Intellj IDEA 简易 ...

  10. Mac快捷键大全及cheatsheet插件

    常用快捷键 CheatSheet 在微信上看到一篇文章分享了一款小软件,觉得有必要推荐一下.名叫CheatSheet.如果你想知道某程序的所有快捷键,只需在Mac上安装CheatSheet,然后长按住 ...