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之element-ui中的 <template slot-scope="scope">
https://blog.csdn.net/tg928600774/article/details/81945140?utm_source=blogxgwz1
- 前端自动化构建工具webpack (一)之webpack安装 和 设置webpack.confi.js
目的: 模块化开发,组件化开发,让代码符合开发规范,更高效 webpack作用:从pack,就知道这是包的意思,比较专业点叫做前端自动化打包构建工具,代码错误检查,预处理,文件合并(打包),代码压缩 ...
- windows系统-phpstudy升级mysql8.0.12安装教程及修改密码和安装注意事项
1.下载安装包,下载地址:mysql8.0.12 .如果你想要下载其它版本可以选择:mysql历史版本地址. 2.下载好,删除phpstudy的mysql目录.如果数据重要的,注意备份数据!同意把m ...
- mysql避免数据库误操作小技巧(转)
避免混淆开发环境的DB和生产环境的DB这在小公司小团队尤其常见.一个人即负责开发,又管DB.桌面上开了一坨终端,有的是开发的DB,有的是生产的DB.一不留神,就写串了,或者粘贴串了.更郁闷的是,有时候 ...
- [No0000199]设计模式总结
设计模式之间的关系: 设计模式总概况: 一.设计原则 .单一职责原则 一个类,只有一个引起它变化的原因.应该只有一个职责.每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一 ...
- windows 10 超级优化,同时解决本地磁盘100%的问题
windows 10 超级优化,同时解决本地磁盘100%的问题 我的系统是笔记本I7处理器,配置了web服务器IIS 和一个数据库(mysql7),同时启用了虚拟机(表中已禁用),以及安装了offic ...
- 【托业】【新东方全真模拟】03~04-----P5~6
❤ customer satisfaction survey 客户满意度调查 ❤ lose + 宾语:be lost ❤ superior (在品质上)更好的 ❤ be entitled to ...
- Lint found fatal errors while assembling a release target
1.Android 打包错误信息 Generate signed Bundle or APK 打包时,报了一个错,错误信息如下: Error:Execution failed for task ´: ...
- java框架之SpringBoot(1)-入门
简介 Spring Boot 用来简化 Spring 应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的.产品级别的应用. 背景: J2EE 笨重的开发.繁多的配置.低下的开发效率 ...
- python基础(6)-深浅拷贝
赋值 字符串和数字 # id()函数可以获取变量在内存中的地址标识 num1 = 2; num2 = 2; print(id(num1)) # result:8791124202560 print(i ...