题目链接

BZOJ

题解

拉格朗日乘数法

拉格朗日乘数法用以求多元函数在约束下的极值
我们设多元函数\(f(x_1,x_2,x_3,\dots,x_n)\)
以及限制\(g(x_1,x_2,x_3,\dots,x_n) = E\)
我们需要求\(f\)在限制\(g\)下的极值
如图

当\(f\)取到最值时,必然与\(g\)的等高线相切
所以我们只需找出这个切点
切点处两函数的梯度向量平行\({\nabla f~//~\nabla g}\)
梯度向量的每一维就是该维下的偏导函数
\[{\nabla f=(\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\frac{\partial f}{\partial x_3},\dots,\frac{\partial f}{\partial x_n})}\]
偏导可以理解为把别的变量看做常数,只对一个变量求导

所以只需令
\[\nabla f = \lambda \nabla g\]
可以得到\(n\)个方程,加上\(g\)本身就是一个方程
可以得到\(n + 1\)个方程,可解\(\lambda\)以及\(x_i\)

本题

限制是
\[\sum\limits_{i = 1}^{n}s_ik_i(v_i - v'_i)^{2} = E\]
我们要最小化
\[\sum\limits_{i = 1}^{n}\frac{s_i}{v_i}\]
利用拉格朗日乘数法,我们求出\(n + 1\)个方程
对于变量\(x_i\)的偏导,可得到方程
\[2\lambda k_iv_i^{2}(v_i - v'_i) = -1\]
首先\(v_i \ge v'_i\),所以除\(\lambda\)外左边是正的,所以\(\lambda\)是负的,然后可以发现\(v_i\)关于\(\lambda\)单调
而方程
\[\sum\limits_{i = 1}^{n}s_ik_i(v_i - v'_i)^{2} = E\]
左边也关于\(v_i\)单调,所以可以使用二分求解
当然求\(v_i\)也可以用牛顿迭代

还有就是精度要开够大。。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 10005,maxm = 100005;
const double eps = 1e-13,INF = 1e12;
int n;
double E,v1[maxn],v[maxn],s[maxn],k[maxn];
inline double f(int i,double lam){return 2 * lam * k[i] * v[i] * v[i] * (v[i] - v1[i]) + 1;
}
inline double cal(double lam){REP(i,n){double l = max(v1[i],0.0),r = INF;while (r - l > eps){v[i] = (l + r) / 2.0;if (f(i,lam) >= 0) l = v[i];else r = v[i];}v[i] = l;}double re = 0;REP(i,n) re += s[i] * k[i] * (v[i] - v1[i]) * (v[i] - v1[i]);return re;
}
int main(){scanf("%d%lf",&n,&E);REP(i,n) scanf("%lf%lf%lf",&s[i],&k[i],&v1[i]);double l = -INF,r = 0,mid;while (r - l > eps){mid = (l + r) / 2.0;if (cal(mid) >= E) r = mid;else l = mid;}cal(l);double ans = 0;REP(i,n) ans += s[i] / v[i];printf("%.10lf\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9250271.html

BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】相关推荐

  1. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘

    2876: [Noi2012]骑行川藏 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1033  Solved: ...

  2. bzoj2876: [Noi2012]骑行川藏 :拉格朗日乘数法

    题目链接 bzoj2876 题目描述 Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻, ...

  3. [BZOJ2876] [NOI2012]骑行川藏

    Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...

  4. BZOJ2876: [Noi2012]骑行川藏

    显然最优情况下体力耗费恰好为E,我们记f(v1,v2-.vn)为在这n个速度下蛋蛋骑到n的耗时,phi(v1,v2-vn)为在这n个速度下蛋蛋骑到n耗费的体力,那么我们就是要在满足phi=E的情况下求 ...

  5. bzoj2876 [Noi2012]骑行川藏 [二分+拉格朗日乘数法]

    Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...

  6. BZOJ2876 [Noi2012]骑行川藏

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. bzoj 2876: [Noi2012]骑行川藏 拉格朗日乘子法

    题意 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行前设 ...

  8. [NOI2012]骑行川藏

    [NOI2012]骑行川藏 思路一:二分导数 http://www.cnblogs.com/RabbitHu/p/9019762.html 考虑"性价比"即花费单位能量缩短的时间. ...

  9. 2876: [Noi2012]骑行川藏

    2876: [Noi2012]骑行川藏 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1243  Solved: ...

最新文章

  1. python可视化脉搏和血氧数据并通过阈值动态调整、动态可视化异常值
  2. CentOS下Redis安装配置小结
  3. 检查卷位图时发现损坏怎么修复_中频弯管严密性如何测试?怎么修复中频弯管?...
  4. C++ Primer 5th笔记(chap 15 OOP)继承之派生类
  5. ubuntu安装VMware Tools
  6. android布局技巧:创建高效布局
  7. vb6 由于超出容量限制 不能创建新事务_分布式限流?你也能轻松玩转(没啥新技术)...
  8. 判断整除(opj)(动态规划)
  9. InputStream和Reader,FileInputStream和 FileReader的区别
  10. 三字经带拼音a4打印版_人教版八年级下册英语6单元重点单词带音标打印版
  11. 运动目标跟踪(十三)--SRDCF/DeepSRDCF
  12. CentOS下apache绑定域名
  13. 最实诚导师招生简章“火”了:目前只有不太充足的经费,但绝不克扣研究生补贴!...
  14. linux之 sed命令
  15. 分形艺术能让你感受上帝的力量——新锐100设计师风达专访
  16. 转载 信号量 第六篇
  17. 金融中需要的计算机知识,金融笔试中的综合知识一般会考什么?
  18. Vim编辑器的基本使用(二)末行模式中的命令
  19. 苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功)
  20. fiddler手机抓包配置代理后没有网络(手机不能上网)

热门文章

  1. 为什么计算机的编码那么多,为什么中国剩余定理可用于计算机编码?
  2. 此域的推荐安全级别是“安全级-高”的解决办法
  3. 不要做一个浮躁的程序员
  4. ZOJ-3494 BCD Code (ac自动机+数位dp)
  5. POJ 3258 -- River Hopscotch(二分)
  6. VS Code修改菜单栏字体大小
  7. (分组交换时延)谢希仁 第七版第一章1-10题详细解答
  8. python 继承的规则
  9. 2021杭州高考杭二成绩查询,2021年杭州重点高中名单及排名,杭州高中高考成绩排名榜...
  10. Linux基础-1.0共享文件夹创建