【bzoj2876】 Noi2012—骑行川藏
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—骑行川藏的更多相关文章
- bzoj2876 [Noi2012]骑行川藏
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)
题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...
- [BZOJ2876][NOI2012]骑行川藏(拉格朗日乘数法)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2876 分析:就是要求约束条件下函数的极值,于是拉格朗日乘数列方程,发现化简后的关于vi ...
- BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】
题目链接 BZOJ 题解 拉格朗日乘数法 拉格朗日乘数法用以求多元函数在约束下的极值 我们设多元函数\(f(x_1,x_2,x_3,\dots,x_n)\) 以及限制\(g(x_1,x_2,x_3,\ ...
- bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
2876: [Noi2012]骑行川藏 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1033 Solved: ...
- 2876: [Noi2012]骑行川藏 - BZOJ
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- 【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'\),最小化$ \ ...
- NOI2012 骑行川藏
http://www.lydsy.com/JudgeOnline/problem.php?id=2876 表示完全不会...... 还是跪拜大神吧 http://www.cnblogs.com/Ger ...
- [NOI2012] 骑行川藏 | 求导 二分
一个能看的题解!预备知识只有高中数学的[导数].不用什么偏导数/拉格朗日乘子法之类的我看不懂的东西( •̀∀•́ )! 如果你不知道什么是导数,可以找本高中数学选修2-2来看一下!看第一章第1.2节就 ...
随机推荐
- Mysql启动失败解决方案 - 个人经验可能不适合所有场景
以前一直用的Mysql5.5,安装程序是一个exe程序,安装完了相应的服务也给我注册好了,然后直接启动连接即可. 最近升级到了8.0.15,发现和以前不一样了. 8.0.15下载地址 安装解压之后目录 ...
- 记一次开发人员的奇葩操作-------导致root用户不能登录
首先,我表示国庆长假被开发呼叫,是一件很不开心的事...... 1.问开发,是不是/etc/passwd文件被更改了? 回答:没有 还好是新装的服务器,还好哥有服务器管理口的远程控制 单用户模式 ...
- 【Docker】第三篇 Docker容器管理
一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...
- 绝对干货!初学者也能看懂的DPDK解析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...
- linux安装配置JDK脚本
#!/bin/bash # install jdk and configuring environment variables function installjdk(){ tar -zxf jdk- ...
- 2、Ansible在使用过程中出现的错误解决方法
1.安装完成后允许命令出错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (ru ...
- [linux] 查看网卡UUID
virtualbox复制了虚拟机,重新初始化网卡后,需要对/etc/sysconfig/network-scripts/ifcfg-eth0更新UUID值,虽然不改暂时也没发现有问题. 网上查找需要n ...
- “秒杀”问题的数据库和SQL设计【转载】
“秒杀”问题的数据库和SQL设计 APRIL 21ST, 2015 问题的来源 完全不考虑一致性的方案 表结构 方案 存在的问题 保证单用户不会重复购买 解决超卖问题 方案 优化 提高性能了 鱼与熊掌 ...
- 论如何制做一个工程APP的测试内容
测试一般在软件开发过程中就已经开始进行了,测试越早.发现问题解决他的方案成本就越小.测试按照类型来区分可以划分为:单元测试,集成测试,系统测试.而OCUNIT是XCODE自带的单元测试工具.需要建立新 ...
- 做一名合格的程序员(learning of a previous team)
合格程序员的基本素质 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具 有的素质. 1 团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备 ...