[NOI2007]货币兑换Cash(DP+动态凸包)
第一次打动态凸包维护dp,感觉学到了超级多的东西。
首先,set是如此的好用!!!可以通过控制一个flag来实现两种查询,维护凸包和查找斜率k
不过就是重载运算符和一些细节方面有些恶心,90行解决
后面还有一个cdq分治,找时间学下,看下能不能处理一大类恶心的问题
github还是不会用,找时间搞下吧
CODE:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<set> 6 #include<cmath> 7 using namespace std; 8 const double esp=1e-7; 9 const int maxn=101000; 10 int dcmp(double a) { 11 if (fabs(a)<esp) return 0; 12 return a<0?-1:1; 13 } 14 struct node{ 15 double x,y,k;bool f; 16 node(double _x,double _y):x(_x),y(_y),f(0){} 17 node():f(0){} 18 inline bool error(){return x>1e50;} 19 }error(1e51,0); 20 inline bool operator == (const node x,const node y) {return dcmp(x.x-y.x)==0;} 21 inline bool operator < (const node x,const node y){ 22 if (x.f||y.f) return dcmp(x.k-y.k)>0; 23 else return dcmp(x.x-y.x)<0; 24 } 25 inline double operator *(const node x,const node y) {return x.x*y.y-x.y*y.x;} 26 inline node operator -(const node x,const node y){ 27 node tmp; 28 tmp.x=x.x-y.x;tmp.y=x.y-y.y; 29 return tmp; 30 } 31 inline double calc_k(node x,node y) {return (x.y-y.y)/(x.x-y.x);} 32 set<node> gap; 33 typedef set<node>::iterator iter; 34 inline node lower(node x) { 35 iter it=gap.lower_bound(x); 36 return it==gap.end()?error:*it; 37 } 38 inline node next(node x) { 39 iter it=gap.upper_bound(x); 40 return it==gap.end()?error:*it; 41 } 42 inline node pre(node x) { 43 iter it=gap.lower_bound(x); 44 return it==gap.begin()?error:*(--it); 45 } 46 inline void ins(node a) { 47 if (gap.empty()) {a.k=0;gap.insert(a);return;} 48 node d1=pre(a),d2=lower(a); 49 if (d1.error()&&d2.y>a.y) return ; 50 if ((!d1.error())&&(!d2.error())&&(dcmp((d2-d1)*(a-d1))<=0)) return ; 51 if (d2==a) return; 52 node p1,p2=next(a); 53 for (;;){ 54 p1=p2;p2=next(p2); 55 if (p1.error()||p2.error()) break; 56 if (dcmp((p1-a)*(p2-a))<=0) break; 57 gap.erase(p1); 58 } 59 p2=pre(a); 60 for (;;){ 61 p1=p2;p2=pre(p2); 62 if (p1.error()||p2.error()) break; 63 if (dcmp((p1-a)*(p2-a))>=0) break; 64 gap.erase(p1); 65 } 66 d1=pre(a),d2=next(a); 67 if (d1.error()) a.k=0;else a.k=calc_k(d1,a);gap.insert(a); 68 if (!d2.error()) gap.erase(d2),d2.k=calc_k(a,d2),gap.insert(d2); 69 } 70 inline double get_k(double a,double b) { 71 node tmp;tmp.f=1;tmp.k=-a/b; 72 tmp=*(--gap.lower_bound(tmp)); 73 return a*tmp.x+b*tmp.y; 74 } 75 double a[maxn],b[maxn],r[maxn],na[maxn],nb[maxn],f[maxn]; 76 int main(){ 77 int n,s; 78 scanf("%d%d",&n,&s); 79 for (int i=1;i<=n;i++) scanf("%lf%lf%lf",a+i,b+i,r+i); 80 f[1]=s; 81 nb[1]=f[1]/(a[1]*r[1]+b[1]); 82 na[1]=nb[1]*r[1]; 83 ins(node(na[1],nb[1])); 84 for (int i=2;i<=n;i++) { 85 f[i]=max(f[i-1],get_k(a[i],b[i])); 86 nb[i]=f[i]/(a[i]*r[i]+b[i]); 87 na[i]=nb[i]*r[i]; 88 ins(node(na[i],nb[i])); 89 } 90 printf("%.3f\n",f[n]); 91 } 92
转载于:https://www.cnblogs.com/New-Godess/p/4354675.html
[NOI2007]货币兑换Cash(DP+动态凸包)相关推荐
- 【bzoj 1492】【codevs 1797】 [NOI2007]货币兑换Cash (dp+cdq分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 3803 Solved: 1604 [Submit][S ...
- [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 5907 Solved: 2377 [Submit][S ...
- bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- [NOI2007] 货币兑换 (dp+李超树维护凸包)
description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实 ...
- bzoj1492 [NOI2007]货币兑换Cash (斜率DP+cdq分治)
题意:到处都找得到. 我没看错的话当年考试的时候的题面里头,是提示了买卖一定是全部买入和卖出的.这样一来就好办了.cdq的论文里面那个F并不是她所说的那样,而是就是那个最优值.方程转移的时候实际上是枚 ...
- bzoj1492: [NOI2007]货币兑换Cash
码了我两个星期的题啊,终于写完了,感觉一半的时间都在调splay,后面写cdq好像轻松一点,cdq码量小一倍,而且又好想(可能是我调的时候理解了)感觉这种黑科技很nb,关键是可以减少细节出错(像我这种 ...
- bzoj 1492: [NOI2007]货币兑换Cash
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
最新文章
- hibernate Disabling contextual LOB creation as connection was null
- (转)响应式Web设计是大势所趋还是时代的产物
- python 轮廓矩阵_python – 在3D numpy矩阵中绘制给定值的曲面轮廓
- 【2016年第3期】大数据治理的数据模式与安全
- html工作界面抽象吗,WEB界面设计五种特征-网页设计,HTML/CSS
- Android TouchEvent事件传递机制
- cad填充密度怎么调整_CAD填充技巧之填充比例
- 2022 Java IDEA 安装导入JDBC驱动
- python自动答题助手_头脑王者python答题助手
- 《人类简史-从动物到上帝》读后感
- 数据库服务器文件路径,服务器数据库的文件路径
- 【Linux】进程状态
- 什么是同源策略?解决跨域的三种方法?
- 泡泡玛特市值千亿背后,我们为什么会为盲盒买单?
- 爪哇国政府有个绑架局
- 标贝科技|智能语音助手+全息形象,会是下一个趋势吗
- 格式塔理论主要是用计算机,格式塔理论在UI设计中的运用
- 制作PDF模板实现PDF文件生成
- linux 搭建游戏服务器,Linux系统下玩经典游戏 CS1.5服务器架设
- 数据猿·金猿榜丨2017中国智能营销域最具潜力创业公司