CodeForces - 813C The Tag Game(拉格朗日乘数法,限制条件求最值)

【传送门】http://codeforces.com/problemset/problem/813/C

【题意】给定整数a,b,c,s,求使得  xa yzc值最大的实数 x,y,z , 其中x + y + z <= s. (1?≤?S?≤?103  , 0?≤?a,?b,?c?≤?103)

【题解】设P(x,y,z ) = xa yzc,则P(x,y,z)是递增的,要使 函数值尽可能地大,那么必取 x + y + z = s

问题转化成:已知限定条件  x + y + z = s, 求P(x,y,z)取得最大值的(x,y,z)

显然,这是运用拉格朗日乘数法的模板题。

【拉格朗日乘数法】

解决的问题模型 : 已知G(x,y,z) = 0

求F(x,y,z)最值(或者极值,一般情况下拉格朗日乘数法求得的极值点就是最值点)

设L(x,y,z) = F(x,y,z) + λG(x,y,z)

将L(x,y,z)分别对x,y,z求偏导,得到3个四元一次方程,加上原来的一个限定条件G(x,y,z) = 0,共得到4个方程,解4个未知数(x,y,z,λ)

求出极值点(x, y , z)即可。

最值只可能在边界处或者极值点处取到,一般情况下极值点就是最值点。

【回到本题】令G(x,y,z) = x + y + z - s , F(x,y,z) = alnx + blny + clnz  .用上述方法解出极值点(s*a/(a+b+c) , s*b/(a+b+c), s*c/(a+b+c))这就是所求答案。

注意a + b + c = 0的特判情况,还需要注意精度,题目要求1e-6,但是精度要达到1e-10以上才行,不然会WA,有点坑。

【AC代码】

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
#include<cstring>
#include<iomanip>
using namespace std;
typedef long long ll;

double s;
double a,b,c;

int main(){
    while(cin>>s){
        cin>>a>>b>>c;
        if(a + b + c == 0){
            cout<<1.0*s<<" "<<0<<" "<<0<<endl;
            continue;
        }
        cout<<setiosflags(ios::fixed)<<setprecision(18)<<s/(a+b+c)*a<<" "<<s/(a+b+c)*b<<" "<<s/(a+b+c)*c<<endl;
    }
}

原文地址:https://www.cnblogs.com/czsharecode/p/9665591.html

时间: 2024-08-29 15:39:20

CodeForces - 813C The Tag Game(拉格朗日乘数法,限制条件求最值)的相关文章

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

详见: http://blog.csdn.net/popoqqq/article/details/42366599 http://blog.csdn.net/whzzt/article/details/51346228 用拉格朗日乘数法,求了偏导之后二分λ.然后求完偏导的那个一元三次式的解可以二分求,因为是单调递增的. 总复杂度\( O(nlog^2n) \) #include<cstdio> #include<cmath> using namespace std; const i

ML(附录4)——拉格朗日乘数法

基本的拉格朗日乘子法(又称为拉格朗日乘数法),就是求函数 f(x1,x2,...) 在 g(x1,x2,...)=C 的约束条件下的极值的方法.其主要思想是引入一个新的参数 λ (即拉格朗日乘子),将约束条件函数与原函数联系到一起,使能配成与变量数量相等的等式方程,从而求出得到原函数极值的各个变量的解.拉格朗日乘子是数学分析中同一名词的推广. 什么是拉格朗日乘数法 简单地说,拉格朗日乘数法是用来最小化或最大化多元函数的.如果有一个方程f(x,y,z),在这个方程里的变量之间不是独立的,也就是说这

寻找“最好”(3)——函数和泛函的拉格朗日乘数法

拉格朗日乘数法 大多数的优化问题都会加入特定的约束,而不仅仅是指定起点和终点,此时需要更好的办法去解决优化问题,拉格朗日乘数法正是一种求约束条件下极值的方法. 简单地说,拉格朗日乘数法(又称为拉格朗日乘数法)是用来最小化或最大化多元函数的.如果有一个方程f(x,y,z),在这个方程里的变量之间不是独立的,也就是说这些变量之间是有联系的,这个联系可能是某个方程g(x,y,z) = C:也就是g(x,y,z) = C定义了x,y,z之间的关系,这个关系对变量做出了一定的的限制,我们需要在这个限制下来

拉格朗日乘数法

目录(?)[-] 介绍 拉格朗日乘数的运用方法 例子 很简单的例子 另一个例子 经济学 在数学最优化问题中,拉格朗日乘数法(以数学家约瑟夫·路易斯·拉格朗日命名)是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法.这种方法将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题,其变量不受任何约束.这种方法引入了一种新的标量未知数,即拉格朗日乘数:约束方程的梯度(gradient)的线性组合里每个向量的系数. 此方法的证明牵涉到偏微分,全微分或链法,从

拉格朗日乘数法与KKT条件

关于拉格朗日乘数法和KKT条件的一些思考 从我开始接触拉格朗日乘数法到现在已经将近有四个月了,但似乎直到今天我对其的理解才开始渐渐清晰,相信很多人在科研初期也会对一些基础的算法困惑不解,而一篇好的教程则可以大大缩短困惑的时间,从而把更多时间用在开创性的工作上去.经过近几日的搜索,我发现网上还是有一些说明是很不错得,英文较好的同学可以直接去阅读Hugo的介绍(http://www.onmyphd.com/?p=lagrange.multipliers).下面是我近几日学下来的一些见解,看下来如果有

[Math &amp; Algorithm] 拉格朗日乘数法

拉格朗日乘数法(Lagrange Multiplier Method)之前听数学老师授课的时候就是一知半解,现在越发感觉拉格朗日乘数法应用的广泛性,所以特意抽时间学习了麻省理工学院的在线数学课程.新学到的知识一定要立刻记录下来,希望对各位博友有些许帮助. 1. 拉格朗日乘数法的基本思想 作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题.拉格朗日乘子背后的数学意义是其

浅谈拉格朗日乘数法

最近偶然看到一篇文章介绍到拉格朗日乘数法, 先贴出地址:cnblogs.com/maybe2030/p/4946256.html 因为我也是刚学了这个方法,对这个东西一知半解,然而初读这篇文章后,感觉有必要好好搞懂这个东西,因为原文写的比较正式,有一些晦涩的词汇难以理解,所以我自己翻书重新学习了一下,以下是个人感悟,并不权威,欢迎指摘! 高等数学同济第5版中这样讲: 要找到函数z=f(x,y)在附加条件g(x,y)=0下的可能极值点,可令L(x,y)=f(x,y)+ug(x,y); 解出x,y,

《University Calculus》-chaper12-多元函数-拉格朗日乘数法

求解条件极值的方法:拉格朗日乘数法 基于对多元函数极值方法的了解,再具体的问题中我们发现这样一个问题,在求解f(x,y,z)的极值的时候,我们需要极值点落在g(x,y,z)上这种对极值点有约束条件,通过直接代换消元的方法似乎会出现一些问题. 比如这个例题. 它面临的问题是,代换消元然后通过求偏导得来的驻点,我们无法控制其满足约束条件g(x,y,z),因此我们需要寻找新的方法来解决这种条件极值问题. 首先这里给出方向导数和梯度中给出的等式关系,这个具体的由来我们会在该小结中详细介绍. 对于可微函数

[转] 拉格朗日乘数法

在数学最优化问题中,拉格朗日乘数法(以数学家约瑟夫·路易斯·拉格朗日命名)是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法.这种方法将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题,其变量不受任何约束.这种方法引入了一种新的标量未知数,即拉格朗日乘数:约束方程的梯度(gradient)的线性组合里每个向量的系数. 此方法的证明牵涉到偏微分,全微分或链法,从而找到能让设出的隐函数的微分为零的未知数的值. 介绍 先看一个二维的例子:假设有函数:f