http://www.lydsy.com/JudgeOnline/problem.php?id=2876 (题目链接)

题意

  在满足约束条件$${\sum_{i=1}^ns_ik_i(v_i-v_i')^2=E}$$

  求$${min\sum_{i=1}^n\frac{s_i}{v_i}}$$

Solution

  像这种形式的存在一个多元函数${g(v_1,v_2,v_3,······,v_n)=E}$的约束,求解多元函数${f(v_1,v_2,v_3,······,v_n)}$的最值,我们使用拉格朗日乘子法。

  在解这道题之前,我们要知道什么是偏导数,梯度向量,等高线等等一系列的东西。当然我是不知道的,只能靠自己YY了。如果这些你都知道了,那么你应该就会知道到当${f}$取到最值时,${f}$和${g}$的等高线相切→_→,既然它们的等高线相切,那么它们的梯度向量平行${\nabla f~//~\nabla g}$。

  梯度向量的每一维就是这个函数对应那一维的偏导数$${\nabla f=(\frac{\partial f}{\partial v_1},\frac{\partial f}{\partial v_2},\frac{\partial f}{\partial v_3}······,\frac{\partial f}{\partial v_n})}$$

  因为${f}$和${g}$的梯度向量平行,我们只要知道它们在哪一个点平行,我们就解出了${v_1···v_n}$。设${\nabla f=\lambda \nabla g}$,我们可以列出${n+1}$个等式。

$${\frac{\partial f}{\partial v_1}=\lambda \frac{\partial g}{\partial v_1}}$$

$${\frac{\partial f}{\partial v_2}=\lambda \frac{\partial g}{\partial v_2}}$$

$${\frac{\partial f}{\partial v_3}=\lambda \frac{\partial g}{\partial v_3}}$$

$${······}$$

$${\frac{\partial f}{\partial v_n}=\lambda \frac{\partial g}{\partial v_n}}$$

$${g(v_1,v_2,v_3,······,v_n)=E}$$

  求出偏导数代入。

$${-\frac{s_1}{v_1^2}=2\lambda k_1s_1(v_1-v_1')}$$

$${-\frac{s_2}{v_2^2}=2\lambda k_2s_2(v_2-v_2')}$$

$${-\frac{s_3}{v_3^2}=2\lambda k_3s_3(v_3-v_3')}$$

$${······}$$

$${-\frac{s_n}{v_n^2}=2\lambda k_ns_n(v_n-v_n')}$$

$${\sum_{i=1}^nk_i(v_i-v_i')^2s_i=E}$$

  化简一下。

$${2\lambda k_1v_1^2(v_1-v_1')=-1}$$

$${2\lambda k_2v_2^2(v_2-v_2')=-1}$$

$${2\lambda k_3v_3^2(v_3-v_3')=-1}$$

$${······}$$

$${2\lambda k_nv_n^2(v_n-v_n')=-1}$$

$${\sum_{i=1}^nk_i(v_i-v_i')^2s_i=E}$$

  考虑${v_i}$的范围。如果对应的${v_i'<0}$,吹的是逆风,那么${v_i>0}$;如果${v_i'>0}$,吹的是顺风,那么让${v_i=v_i'}$一定优于${v_i<v_i'}$,于是我们得到了${v_i}$的下界。${v_i}$的上界就是把所有的能量全部用在这一段路上所能达到的最大速度(然而程序里面上界不能这样写,数据有几个点存在${s_i=0}$的情况,smg嘛→_→)。

  知道了${v_i}$的下界,那么显然${k_iv_i^2(v_i-v_i')>0}$,所以${\lambda<0}$。所以${v_i}$随着${\lambda}$的增大而增大,而${\sum_{i=1}^nk_i(v_i-v_i')^2s_i}$随着${v_i}$的增大而增大。所以我们二分${\lambda}$,进而二分求解${v_i}$,把${v_i}$代入函数${g}$,与${E}$比较比较大小来判断${\lambda}$的范围是应该往上还是往下。

细节

  公式不要写错,精度把握好。

代码

// bzoj2876
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define eps 1e-13
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
long double s[maxn],k[maxn],v[maxn],vp[maxn],maxv[maxn],Eu;
int n; long double check(long double lambda) {
long double tmp=0;
for (int i=1;i<=n;i++) {
long double l=max((long double)0.0,vp[i]),r=maxv[i];v[i]=l;
while (l<=r) {
long double mid=(l+r)/2;
if (2*lambda*mid*mid*k[i]*(mid-vp[i])>=-1) l=mid+eps,v[i]=mid;
else r=mid-eps;
}
tmp+=k[i]*(v[i]-vp[i])*(v[i]-vp[i])*s[i];
}
return tmp<=Eu;
}
int main() {
scanf("%d%LF",&n,&Eu);
for (int i=1;i<=n;i++) {
scanf("%Lf%Lf%Lf",&s[i],&k[i],&vp[i]);
//maxv[i]=vp[i]+sqrt(Eu/k[i]/s[i]);
maxv[i]=inf;
}
long double l=-inf,r=0,lambda;
while (l<=r) {
long double mid=(l+r)/2;
if (check(mid)) l=mid+eps,lambda=mid;
else r=mid-eps;
}
check(lambda);
long double ans=0;
for (int i=1;i<=n;i++) ans+=s[i]/v[i];
printf("%.6Lf",ans);
return 0;
}

【bzoj2876】 Noi2012—骑行川藏的更多相关文章

  1. bzoj2876 [Noi2012]骑行川藏

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

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

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

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2876 分析:就是要求约束条件下函数的极值,于是拉格朗日乘数列方程,发现化简后的关于vi ...

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

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

  5. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘

    2876: [Noi2012]骑行川藏 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1033  Solved: ...

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

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

  7. 【BZOJ】2876: [Noi2012]骑行川藏

    题意 给出\(s_i, k_i, v_i', E\),满足\(\sum_{i=1}^{n} k_i s_i ( v_i - v_i' )^2 \le E, v_i > v_i'\),最小化$ \ ...

  8. NOI2012 骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 表示完全不会...... 还是跪拜大神吧 http://www.cnblogs.com/Ger ...

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

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

随机推荐

  1. webpack3升级为webpack4

    写在前面的话:为什么要升级,因为公司目前的项目使用webpack3,但是因为是多页应用,入口估计有一百多个,开发模式下慢得不像话,修改一个文件需要十几秒才编译好,之前的解决方案是减少入口,但是要调试其 ...

  2. Hadoop源码阅读环境搭建(IDEA)

    拿到一份Hadoop源码之后,经常关注的两件事情就是 1.怎么阅读?涉及IDEA和Eclipse工程搭建.IDEA搭建,选择源码,逐步导入即可:Eclipse可以选择后台生成工程,也可以选择IDE导入 ...

  3. TensorFlow中的卷积函数

    前言 最近尝试看TensorFlow中Slim模块的代码,看的比较郁闷,所以试着写点小的代码,动手验证相关的操作,以增加直观性. 卷积函数 slim模块的conv2d函数,是二维卷积接口,顺着源代码可 ...

  4. Scrum Meeting 5 -2014.11.11

    放假过掉一大半.大家都努力赶着进度,算法实现基本完成.可能还有些细小的改动,但也可以统一进入测试阶段了. 今天叫了部分在校人员开了个小会.任务决定以测试为主,同时开始进行服务器的部署. 在之前尝试服务 ...

  5. OO学习总结与体会

    前言 经过了对于面向对象程序设计的一个月的学习,我初尝了JAVA以及面向对象程序的魅力.经历了三次难度逐渐加大的课后编程作业,我对于工程化面向对象编程以及调试有了深刻的认识与颇多感想.我写下本篇文章以 ...

  6. datetime类型转换

    Select CONVERT(varchar(100), GETDATE(), 8):14:53:14 Select CONVERT(varchar(100), GETDATE(), 9): 06  ...

  7. Java 反射 不定参数bug

    遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number of arguments的问题解析如下: 1.错误bug wrong n ...

  8. Python中,os.listdir遍历纯数字文件乱序如何解决

    Python中,os.listdir遍历纯数字文件乱序如何解决 日常跑深度学习视觉相关代码时,常常需要对数据集进行处理.许多图像文件名是利用纯数字递增的方式命名.通常所用的排序函数sort(),是按照 ...

  9. Docker基础教程

    一.Docker是什么? KVM, Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器:而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操 ...

  10. FineReport基本使用

    FineReport官方开发文档链接:http://help.finereport.com 1.FineReport是帆软软件有限公司自主研发的一款企业级web报表软件产品.FineReport报表软 ...