题目链接

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;
}

BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】的更多相关文章

  1. [BZOJ2876][NOI2012]骑行川藏(拉格朗日乘数法)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2876 分析:就是要求约束条件下函数的极值,于是拉格朗日乘数列方程,发现化简后的关于vi ...

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

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

  3. bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)

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

  4. bzoj2876 [Noi2012]骑行川藏

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

  5. [NOI2012]骑行川藏——拉格朗日乘子法

    原题链接 不会啊,只好现学了拉格朗日乘子法,简单记录一下 前置芝士:拉格朗日乘子法 要求\(n\)元目标函数\(f(x_1,x_2,...,x_n)\)的极值,且有\(m\)个约束函数形如\(h_i( ...

  6. bzoj 2876: [Noi2012]骑行川藏【拉格朗日乘数法+二分】

    详见: http://blog.csdn.net/popoqqq/article/details/42366599 http://blog.csdn.net/whzzt/article/details ...

  7. 题解 洛谷 P2179 【[NOI2012]骑行川藏】

    题意为在满足\(\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i\leqslant E_U\)的条件下最小化\(\sum\limits_{i=1}^n\frac{ ...

  8. 2876: [Noi2012]骑行川藏 - BZOJ

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

  9. 【BZOJ】2876: [Noi2012]骑行川藏

    题意 给出\(s_i, k_i, v_i', E\),满足\(\sum_{i=1}^{n} k_i s_i ( v_i - v_i' )^2 \le E, v_i > v_i'\),最小化$ \ ...

随机推荐

  1. 机器学习算法 --- SVM (Support Vector Machine)

    一.SVM的简介 SVM(Support Vector Machine,中文名:支持向量机),是一种非常常用的机器学习分类算法,也是在传统机器学习(在以神经网络为主的深度学习出现以前)中一种非常牛X的 ...

  2. [奇葩问题] Error Domain=NSURLErrorDomain Code=-1003

    问题描述: 新上线的产品,ios同事拿着一串报错来找我,日志如下:err =Error Domain=NSURLErrorDomain Code=-1003 "未能找到使用指定主机名的服务器 ...

  3. web.xml配置文件中<async-supported>true</async-supported>报错

    web.xml配置文件中<async-supported>true</async-supported>报错 http://blog.csdn.net/dream_ll/arti ...

  4. AJAX(Asynchronous JavaScript and XML)学习笔记

    基本概念: 1.AJAX不是一种新的编程语言,而是一种使用现有标准的新方法. 2.AJAX最大的优点是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容,用于创建快速动态网页(传统网页如 ...

  5. Daily Srum 10.22

    今天大家的状态比较好,但是还是有很多问题没有解决.首先就是服务器这方面,部分同学还不怎么会用:其次就是看代码出现了困难,不能完整地阅读:还有就是我们的昨天的任务有点困难,部分同学不能按时按量的完成!于 ...

  6. Sprint9

    进展:完善设置事件提醒界面,增加调用手机铃声部分,以及是否选择振动,以及可以添加事件进行保存.

  7. “Gogoing”改进方案

    通过看见他们对我们团队的意见点评,我们还要有更多改善的地方. 首先,就是界面的优化: 其次,加上自己些特有的功能,吸引更多的用户: 然后,需要整理大量的数据库信息才能完善: 最后,需要有其他软件的集成 ...

  8. java-switch语句

    switch语句是常用的java循环判断语句,但是有的知识点并不一定清楚. 首先是switch语句括号中的判断条件,判断条件只能是整型或者字符和整型或者字符组成的表达式. 再就是case语句,可以称之 ...

  9. flownet2.0 caffe anaconda2 编译安装

    1. 下载flownet2.0源码到指定目录 cd /home/zzq/saliency_models/deep_optical_flow git clone https://github.com/l ...

  10. 【贪心算法】POJ-1328 区间问题

    一.题目 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, ...