bzoj 2508: 简单题【拉格朗日乘数法】

大概是对于f(x,y)求min,先把x看成常数,然后得到关于y的一元二次方程,然后取一元二次极值把y用x表示,再把x作为未知数带回去化简,最后能得到一个一元二次的式子,每次修改这个式子的参数即可。

智商欠费解释不清,详见Claris大神 http://www.cnblogs.com/clrs97/p/4403197.html

#include<cstdio>
#include<cmath>
using namespace std;
const int N=120005;
int n,q,op,i,m;
double X1,X2,Y1,Y2,a,b,c,d,aa[N],bb[N],cc[N],ab[N],ac[N],bc[N],saa,sbb,scc,sab,sac,sbc,eps=1e-8,ans;
inline bool cmp(double x)
{
    return fabs(x)<eps;
}
inline double solve(double a,double b,double c)
{
    if(cmp(a))
        return c;
    double x=-b/(2.0*a);
    return a*x*x+b*x+c;
}
int main()
{
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);
            if(cmp(X1-X2))
                a=1,b=0,c=-X1;
            else
                a=(Y2-Y1)/(X2-X1),b=-1,c=Y1-a*X1;
            d=a*a+b*b;
            aa[++n]=a*a/d,bb[n]=b*b/d,cc[n]=c*c/d,ab[n]=a*b/d,ac[n]=a*c/d,bc[n]=b*c/d;
            saa+=aa[n],sbb+=bb[n],scc+=cc[n],sab+=ab[n],sac+=ac[n],sbc+=bc[n];
            m++;
        }
        if(op==1)
        {
            scanf("%d",&i);
            saa-=aa[i],sbb-=bb[i],scc-=cc[i],sab-=ab[i],sac-=ac[i],sbc-=bc[i];
            m--;
        }
        if(op==2)
        {
            if(!m)
            {
                puts("0.00");
                continue;
            }
            if(cmp(sbb))
                a=b=0;
            else
                a=-sab/sbb,b=-sbc/sbb;
            ans=solve(saa+2.0*a*sab+a*a*sbb,2.0*(b*sab+sac+a*b*sbb+a*sbc),b*b*sbb+2.0*b*sbc+scc);
            if(cmp(ans))
                ans=0;
            printf("%.2f\n",ans);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/lokiii/p/8453511.html

时间: 2024-11-01 22:35:52

bzoj 2508: 简单题【拉格朗日乘数法】的相关文章

BZOJ 2508 简单题 数学算法

题目大意:维护一个平面,支持三种操作: 0.加入一条直线(给的是两点式) 1.删除一条直线 2.询问到所有直线距离平方和最小的点 题解见 http://blog.sina.com.cn/s/blog_ab8386bc0101i1nj.html 我只是贴代码供参考的- - 注意我的abcdef和题解设的不一样- - 这简单题WA了两页- - #include <cmath> #include <cstdio> #include <cstring> #include <

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

拉格朗日乘数法与KKT条件

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

拉格朗日乘数法

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

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

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

[转] 拉格朗日乘数法

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

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之间的关系,这个关系对变量做出了一定的的限制,我们需要在这个限制下来

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

[传送门]http://codeforces.com/problemset/problem/813/C [题意]给定整数a,b,c,s,求使得  xa yb zc值最大的实数 x,y,z , 其中x + y + z <= s. (1?≤?S?≤?103  , 0?≤?a,?b,?c?≤?103) [题解]设P(x,y,z ) = xa yb zc,则P(x,y,z)是递增的,要使 函数值尽可能地大,那么必取 x + y + z = s 问题转化成:已知限定条件  x + y + z = s, 求