题意为在满足\(\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i\leqslant E_U\)的条件下最小化\(\sum\limits_{i=1}^n\frac{s_i}{v_i}\)

先考虑贪心,因为最小化\(\sum\limits_{i=1}^n\frac{s_i}{v_i}\),所以\(\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i=E_U\)时为最优情况。

发现是一个有约束的极值问题,考虑用拉格朗日乘数法来解决。

设\(f(v)=\sum\limits_{i=1}^n\frac{s_i}{v_i}\),\(φ(v)=\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i-E_U\)

设拉格朗日函数为\(L(v,λ)=f(v)+λφ(v)\)

代入得\(L(v,λ)=\sum\limits_{i=1}^n\frac{s_i}{v_i}+λ[\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i-E_U]\)

根据拉格朗日乘数法得,当拉格朗日函数\(L\)梯度为\(0\)时,\(f(v)\)最优

\[\begin{cases}\nabla_{v_1}L(v,λ)=0\\\nabla_{v_2}L(v,λ)=0\\......\\\nabla_{v_n}L(v,λ)=0\\\nabla_λL(v,λ)=0\end{cases}
\]

求偏导后可得(这里将有关\(v\)的写成一个式子了)

\[\begin{cases}\nabla_vL(v,λ)=2λk_i(v_i-v_i^\prime)s_i-\frac{s_i}{v_i^2}=0\\\nabla_λL(v,λ)=\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i-E_U=0\end{cases}
\]

进一步化简后得

\[\begin{cases}2λk_iv_i^2(v_i-v_i^\prime)=1\ (1)\\\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i=E_U\ (2)\end{cases}
\]

那么将上面的方程组解出来,即为我们要求的答案。

考虑到在\((1)\)式中\(v_i\)必须大于等于\(v_i^\prime\),所以为保证式子成立\(λ\)必须大于\(0\),同时发现\((1)\)式左边关于\(v_i\)单调递增,所以我们二分求出每一个\(v_i\),再代入\((1)\)式来检验。

但发现\(λ\)的值也不确定,于是要在二分\(v_i\)的外层再套上一层\(λ\)的二分,这里代入\((2)\)式来检验。

实现细节看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 10010
#define eps 1e-12
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n;
double E,ans;
double s[maxn],k[maxn],v[maxn],u[maxn];
double calc(double x)
{
return x*x;
}
bool judge(double p,double v,double k,double u)
{
return 2*p*k*calc(v)*(v-u)<=1;
}
bool check(double p)
{
double e=0;
for(int i=1;i<=n;++i)
{
double l=max(u[i],(double)0),r=1e5,ans;
while(l+eps<=r)
{
double mid=(l+r)/2.0;
if(judge(p,mid,k[i],u[i])) ans=l=mid;
else r=mid;
}
v[i]=ans;
e+=k[i]*calc(v[i]-u[i])*s[i];
}
return e<=E;
}
int main()
{
read(n);
scanf("%lf",&E);
for(int i=1;i<=n;++i)
scanf("%lf%lf%lf",&s[i],&k[i],&u[i]);
double l=0,r=1e5;
while(l+eps<=r)
{
double mid=(l+r)/2.0;
if(check(mid)) r=mid;
else l=mid;
}
for(int i=1;i<=n;++i) ans+=s[i]/v[i];
printf("%.8lf",ans);
return 0;
}

题解 洛谷 P2179 【[NOI2012]骑行川藏】的更多相关文章

  1. 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)

    题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...

  2. 【洛谷】P2179 [NOI2012]骑行川藏

    题解 感谢小迪给我讲题啊,这题小迪写挺好的我就不写了吧 小迪的题解 代码 #include <iostream> #include <cstdio> #include < ...

  3. Luogu P2179 [NOI2012]骑行川藏

    题意 给定 \(n\) 个路段,每个路段用三个实数 \(s_i,k_i,v^\prime_i\) 描述,最小化 \[F(v_1,\cdots v_n)=\sum\limits_{i=1}^{n}\fr ...

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

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

  5. bzoj2876 [Noi2012]骑行川藏

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

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

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

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

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

  8. 【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'\),最小化$ \ ...

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

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

随机推荐

  1. java基础——并发1

    一.并发的定义 并发:对于这个概念一直就是没怎么搞懂,就是感觉特别的生疏,(自己从从字面上理解就是多个东西,一起出发),所以就上网上查了一些资料: 同时拥有两个或多个线程,如果程序在单核处理器上运行, ...

  2. 解决github打不开问题

    2020.06.22 使用以下方式: 在https://github.com.ipaddress.com/找到: 在https://fastly.net.ipaddress.com/github.gl ...

  3. 31_栈的分类.swf

    栈的分类: 栈可以分为静态栈和动态栈 静态栈:要删除先删除4才能删除3,以数组为数据结构 动态栈:以链表作为数据结构,在实际中使用动态栈比较多

  4. C#数据结构与算法系列(十五):排序算法(SortAlgorithm)

    1.介绍 排序是将一组数据,以指定的顺序进行排序的过程 2.分类 内部排序法:指将需要处理的所有数据都加载到内部存储器中进行排序 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序

  5. Python 简明教程 --- 13,Python 集合

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 如果代码和注释不一致,那很可能两者都错了. -- Norm Schryer 目录 前几节我们已经介绍 ...

  6. Spring IoC bean 的加载

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 容 ...

  7. 记一次发布/更新npm包的过程及包版本管理

    您可以发布包含package.json文件的任何目录.这里如何首次发布程序包以及如何在以后更新程序包. 如何发布包 制备 了解npm政策 在开始之前,如果您对网站礼仪,命名,许可或其他指南有疑问,最好 ...

  8. 解决移动端点击穿透问题_h5实现移动端点击事件穿透的多种解决方案

    移动端点透点透现象出现的场景: 当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件.在这种情况下,点击A/B重叠 ...

  9. css z-index的层级关系

    定义和用法 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 注释:元素可拥有负的 z-index 属性值. 注释:Z-index 仅能在定位元素上奏 ...

  10. HTML5全局属性汇总

    局部属性和全局属性 局部属性:有些元素能规定自己的属性,这种属性称为局部属性.比如link元素,它具有的局部属性有href. rel. hreflang. media. type. sizes这六个. ...