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. Mysql启动失败解决方案 - 个人经验可能不适合所有场景

    以前一直用的Mysql5.5,安装程序是一个exe程序,安装完了相应的服务也给我注册好了,然后直接启动连接即可. 最近升级到了8.0.15,发现和以前不一样了. 8.0.15下载地址 安装解压之后目录 ...

  2. 记一次开发人员的奇葩操作-------导致root用户不能登录

    首先,我表示国庆长假被开发呼叫,是一件很不开心的事...... 1.问开发,是不是/etc/passwd文件被更改了?  回答:没有   还好是新装的服务器,还好哥有服务器管理口的远程控制 单用户模式 ...

  3. 【Docker】第三篇 Docker容器管理

    一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...

  4. 绝对干货!初学者也能看懂的DPDK解析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...

  5. linux安装配置JDK脚本

    #!/bin/bash # install jdk and configuring environment variables function installjdk(){ tar -zxf jdk- ...

  6. 2、Ansible在使用过程中出现的错误解决方法

    1.安装完成后允许命令出错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (ru ...

  7. [linux] 查看网卡UUID

    virtualbox复制了虚拟机,重新初始化网卡后,需要对/etc/sysconfig/network-scripts/ifcfg-eth0更新UUID值,虽然不改暂时也没发现有问题. 网上查找需要n ...

  8. “秒杀”问题的数据库和SQL设计【转载】

    “秒杀”问题的数据库和SQL设计 APRIL 21ST, 2015 问题的来源 完全不考虑一致性的方案 表结构 方案 存在的问题 保证单用户不会重复购买 解决超卖问题 方案 优化 提高性能了 鱼与熊掌 ...

  9. 论如何制做一个工程APP的测试内容

    测试一般在软件开发过程中就已经开始进行了,测试越早.发现问题解决他的方案成本就越小.测试按照类型来区分可以划分为:单元测试,集成测试,系统测试.而OCUNIT是XCODE自带的单元测试工具.需要建立新 ...

  10. 做一名合格的程序员(learning of a previous team)

    合格程序员的基本素质 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具 有的素质.  1 团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备 ...