原题链接

不会啊,只好现学了拉格朗日乘子法,简单记录一下

前置芝士:拉格朗日乘子法

要求\(n\)元目标函数\(f(x_1,x_2,...,x_n)\)的极值,且有\(m\)个约束函数形如\(h_i(x_1,x_2,...,x_n)=0\)

引入松弛变量\(\alpha _1-\alpha _m\),构造拉格朗日函数如下:

\[L(x_1,x_2,...,x_n,\alpha _1,\alpha _2,...,\alpha _m)=f(x_1,x_2,...,x_n)+\sum\limits_{i=1}^{m}\alpha _ih_i(x_1,x_2,...,x_n)
\]

然后分别对\(x\)和\(a\)求偏导并令偏导值为\(0\)($\nabla $为梯度向量):

\[\nabla _xL(x,\alpha)=0,\nabla _{\alpha}L(x,\alpha)=0
\]

求解上述方程组,即可求得极值点。但是解方程组的代价太大了,在做题时我们一般会通过函数的单调性二分来解

为什么可以这样呢,考虑一下,满足条件的极值点应该是在目标函数的等高线与约束函数曲线相切的点,在这一点上有如下等式成立:

\[\nabla _xf(x)=a\nabla _xh(x)
\]

而拉格朗日函数求导之后和上式本质相同,因此它能求得最值

还有广义拉格朗日乘子法是适用于有不等式约束的情况

题解

首先我们把目标函数和约束函数都找出来

目标函数$f(x)=\sum\limits_{i=1}^{n}\frac{s_i}{v_i}$
约束函数$g(x)=\sum\limits_{i=1}^{n}k_is_i(v_i-v'_i)^2-E_U$
那么拉格朗日函数为
$$L(x,\alpha)=f(x)+\alpha g(x)=-\alpha E_U+\sum\limits_{i=1}^{n}\frac{s_i}{v_i}+\alpha k_is_i(v_i-v'_i)^2$$
求出$v_i$关于$L$的偏导并将其设置为$0$
$$\frac{\partial L(v,\alpha)}{\partial v_i}=-\frac{s_i}{v_i^2}+2\alpha s_ik_i(v_i-v'_i)=0$$
$$\Rightarrow \alpha=\frac{1}{2k_iv_i^2(v_i-v'_i)}$$
经过简单讨论,可以得出$\alpha$随$v$单调递减,$g$随$v$单调递增,所以$g$随$\alpha$单调递减
于是我们可以先二分$\alpha$,然后再二分解出$v$,复杂度$O(nlog^2n)$
附代码:
```cpp
#include

using namespace std;

define N 10000

const double eps = 1e-13, INF = 1e5;

int n;

double Eu, s[N + 5], k[N + 5], v0[N + 5], v[N + 5];

bool check(double lamda) {

for (int i = 1; i <= n; ++i) {

double tar = 1 / (2 * k[i] * lamda), l = max(v0[i], 0.0), r = INF, mid;

while(r - l >= eps) {

mid = (l + r) / 2;

if (mid * mid * (mid - v0[i]) > tar) r = mid;

else l = mid;

}

v[i] = mid;

}

double E = 0;

for (int i = 1; i <= n; ++i)

E += k[i] * s[i] * pow(v[i] - v0[i], 2);

return E <= Eu;

}

int main() {

cin >> n >> Eu;

for (int i = 1; i <= n; ++i)

cin >> s[i] >> k[i] >> v0[i];

double l = 0, r = INF, mid;

while (r - l >= eps) {

mid = (l + r) / 2;

if (check(mid)) r = mid;

else l = mid;

}

double ans = 0;

for (int i = 1; i <= n; ++i)

ans += s[i] / v[i];

cout << setiosflags(ios::fixed) << setprecision(10);

cout << ans << endl;

return 0;

}

[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]骑行川藏

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

  4. [NOI2012] 骑行川藏 | 求导 二分

    一个能看的题解!预备知识只有高中数学的[导数].不用什么偏导数/拉格朗日乘子法之类的我看不懂的东西( •̀∀•́ )! 如果你不知道什么是导数,可以找本高中数学选修2-2来看一下!看第一章第1.2节就 ...

  5. 【bzoj2876】 Noi2012—骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 (题目链接) 题意 在满足约束条件$${\sum_{i=1}^ns_ik_i(v_i-v_i' ...

  6. Luogu P2179 [NOI2012]骑行川藏

    题意 给定 \(n\) 个路段,每个路段用三个实数 \(s_i,k_i,v^\prime_i\) 描述,最小化 \[F(v_1,\cdots v_n)=\sum\limits_{i=1}^{n}\fr ...

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

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

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

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

  9. BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】

    题目链接 BZOJ 题解 拉格朗日乘数法 拉格朗日乘数法用以求多元函数在约束下的极值 我们设多元函数\(f(x_1,x_2,x_3,\dots,x_n)\) 以及限制\(g(x_1,x_2,x_3,\ ...

随机推荐

  1. C#实现自动刷新网页

    需要的童鞋可以下载整个项目:http://pan.baidu.com/s/1geMADvP 运行效果图如下:

  2. windows下使用命令行编译、链接C++源文件

    目录 1.流程 2.操作 1.流程 .cpp-->.o-->.exe 分别为 源文件-->中间目标文件-->可执行文件 两个-->的过程分别为编译.链接 p.s.多个 . ...

  3. 《C++ Primer》读书笔记之第15章:面向对象编程

    一.面向对象概述 1. 面向对象的三个基本特性 封装.继承和多态. 2. 封装 指把隐藏对象的实现细节,仅对外提供接口,从而达到接口与实现分离的效果.封装的好处:一是提高数据的安全性,用户只能使用对象 ...

  4. COGS 2633. [HZOI 2016] 数列操作e

    [题目描述] 一个长度为n的序列,一开始序列数的权值都是0,有m次操作 支持两种操作, 1 L R x,给区间[L,R]内,第一个数加x,第二个数加2^2⋅x,第三个数加3^2⋅x...第R-L+1个 ...

  5. MySQL反应慢排查思路

    数据库异常假死排查需要数据(当时问题的时间,前后时间在2个小时的数据就行) 1.MySQL相关配置 整体可以借助于pt-mysql-summary生成(percona-tools工具) 2.操作系统方 ...

  6. JS中json数组多字段排序方法(解决兼容性问题)(转)

    前端对一个json数组进行排序,用户需要动态的根据自己的选择来对json数据进行排序. 由于后台表设计问题所以不能用sql进行排序,这里用到了js的sort方法. 如果对单字段排序,那么很简单,一个s ...

  7. Web API 接口版本控制 SDammann.WebApi.Versioning

    前言 在设计对外 Web API 时,实务上可能会有新旧版本 API 并存的情况,例如开放 Web API 给厂商串接,但同一个服务更新版本时,不一定所有厂商可以在同一时间都跟着更新他们的系统,但如果 ...

  8. WindowsAPI操作串口

    #include <windows.h> #include <stdio.h> int main() { //1.打开串口 HANDLE hCom; hCom = Create ...

  9. JS基础_函数的简介

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. SIP 3pcc

    3PCC全称Third Party Call Control,中文即第三方电话呼叫控制,指的是由第三方控制者在另外两者之间建立一个会话,由控制者负责会话双方的媒体协商.3PCC是一种非常灵活的会话控制 ...