原题链接

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

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

要求\(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. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  2. find the mincost route【无向图最小环】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599 Problem Description 杭州有N个景区,景区之间有一些双向的路来连接,现在860 ...

  3. Vue(一)环境搭建、创建项目

    1.安装node和npm 因为node已经有npm,所以直接安装node,配置环境变量 官网地址:http://nodejs.cn/download/ 2.查看node是否安装成功,输入名nde -v ...

  4. 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控(centos7环境)

    前提条件,已经安装jmeter并可以运行 1.安装influxdata wget et https://dl.influxdata.com/influxdb/releases/influxdb-1.7 ...

  5. 搭建Leanote笔记

    mongo\leanote #查询Linux开放的端口 netstat -nupl (UDP类型的端口) netstat -ntpl (TCP类型的端口) #下载安装MongoDB wget http ...

  6. 「java.util.concurrent并发包」之 CopyOnWrite

    一 CopyOnWrite容器概述 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容C ...

  7. Subplots

    数据读取: Subplotting 先展示下我们在画一张图时的步骤 生成一个matplotlib Figure对象 生成一个matplotlib AxesSubplot 对象,然后将其赋值给Figur ...

  8. struts 漏洞

    安装shop++ 安装成功 访问 http://127.0.0.1:8080 即网站首页 访问 http://127.0.0.1:8080/admin 即网站后台

  9. github 提交和更新代码

    …or create a new repository on the command line   echo "# flutterPluginsWorks" >> RE ...

  10. Java虚拟机内存基础、垃圾收集算法及JVM优化

    1 JVM 简单结构图   1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放 ...