原题链接

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

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

要求\(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. Java中的一些关键字:static,final,和abstract,interface,以及访问修饰符说明

    1.关键字可以修饰的说明: 关键字 属性(是否可修饰) 方法(是否可修饰) 类(是否可修饰) static 是 是 是 final 是 是 是 abstract 否 是 是 2.关键字的意义: 关键字 ...

  2. POJ3311 Hie with the Pie 【状压dp/TSP问题】

    题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total ...

  3. 一个memset导致的血案

    本文记录解答MIT 6.828 Lab 1 Exercise 10时遇到的一个Bug. 问题描述 在i386_init入口处设置断点并运行,发现执行memset(edata, 0, end - eda ...

  4. TP5.1框架中的模型关联

    一对一关联 hasOne('关联模型','外键','主键'); 关联模型(必须):关联的模型名或者类名 外键:默认的外键规则是当前模型名(不含命名空间,下同)+_id ,例如user_id 主键:当前 ...

  5. 1、Ubuntu linux下同步windows火狐foxfire 浏览器收藏夹问题

    最近在ubuntu系统中使用自带的firefox浏览器,发现有一些问题,比如登陆后,书签,历史记录等,原本在windows下同步的数据无法同步,添加书签的功能也无法使用. 经过查询资料后得知,unbu ...

  6. ssm+reids缓存整合

    在说正文之前我们先介绍一下redis: redis是当今比较热门的非关系型数据库之一,他使用的是key-value的键值对来进行存储,是一个存在于内存之中的数据库,我们一般用于做数据缓存.当我们需要大 ...

  7. Python实现二叉树的非递归先序遍历

    思路: 1. 使用列表保存结果: 2. 使用栈(列表实现)存储结点: 3. 当根结点存在,保存结果,根结点入栈: 4. 将根结点指向左子树: 5. 根结点不存在,栈顶元素出栈,并将根结点指向栈顶元素的 ...

  8. Spring4学习回顾之路12-事务

    事务:事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性.事务的四个关键属性(ACI ...

  9. PID程序实现

    传统PID(位置式PID控制)调节: 这种算法的缺点是,由于全量输出,每次输出均与过去的状态有关,计算时要对 e(k) 进行累加,计算机运算工作量大.而且,因为计算机输出的 u(k) 对应的是执行机构 ...

  10. MySQL反应慢排查思路

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