题解 洛谷 P2179 【[NOI2012]骑行川藏】
题意为在满足\(\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)\)最优
\]
求偏导后可得(这里将有关\(v\)的写成一个式子了)
\]
进一步化简后得
\]
那么将上面的方程组解出来,即为我们要求的答案。
考虑到在\((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]骑行川藏】的更多相关文章
- 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)
题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...
- 【洛谷】P2179 [NOI2012]骑行川藏
题解 感谢小迪给我讲题啊,这题小迪写挺好的我就不写了吧 小迪的题解 代码 #include <iostream> #include <cstdio> #include < ...
- Luogu P2179 [NOI2012]骑行川藏
题意 给定 \(n\) 个路段,每个路段用三个实数 \(s_i,k_i,v^\prime_i\) 描述,最小化 \[F(v_1,\cdots v_n)=\sum\limits_{i=1}^{n}\fr ...
- bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
2876: [Noi2012]骑行川藏 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1033 Solved: ...
- bzoj2876 [Noi2012]骑行川藏
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)
题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...
- 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] 骑行川藏 | 求导 二分
一个能看的题解!预备知识只有高中数学的[导数].不用什么偏导数/拉格朗日乘子法之类的我看不懂的东西( •̀∀•́ )! 如果你不知道什么是导数,可以找本高中数学选修2-2来看一下!看第一章第1.2节就 ...
随机推荐
- PHPWord中文乱码、单元格合并、动态表格模板解决方案合集
摘要: 最近一个项目开发要用到PHP技术导出Word文档,采用PHPWord插件,版本为0.6.2 beta,CodePlex已停止维护.网上还有另外一个版本的PhpWord,项目类名大小写上略有不 ...
- 全)Java从单体到微服务打造房产销售平台 2018年慕课网 高清视频+源码
第1章 课程介绍本章从整体上介绍课程有什么收获,以及课程如何安排,其中包括微服务的两个不同学习阶段--单体开发阶段(基于SpringBoot)和微服务改造阶段(基于SpringCloud),知识点梳理 ...
- jni 字符串的梳理 2 字符串的处理操作
我们实现下面的一个功能: 1.首先在java层传递一个字符串到c层,c层首先将jstring转换成char*类型,然后将两个字符串相加,然后再再将char*类型转换成jstring,在上层显示出来 我 ...
- robot framework使用小结(二)
robot framework关键字驱动采用分层,结合Template做成数据驱动 我个人觉得不管是关键字驱动还是数据驱动,都是基于模块(或者是函数)的概念 新建测试案例baidu02,添加Libra ...
- Mariadb之显式使用表锁和行级锁
首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁 ...
- DOM-BOM-EVENT(5)
5.宽.高.位置相关 5.1.clientX/clientY clientX和clientY表示鼠标在浏览器可视区的坐标位置 <script> document.onclick = fun ...
- 《Java核心技术(卷1)》笔记:第8章 泛型程序设计
(P 327)"菱形"语法: ArrayList<String> files = new ArrayList<>(); // Java 9 扩展了菱形语法的 ...
- Double值保留两位小数的四种方法
public class DoubleTest { //保留两位小数第三位如果大于4会进一位(四舍五入) double f = 6.23556; /** *使用精确小数BigDecimal */ pu ...
- python基础--自定义模块、import、from......import......
自定义模块.import.from......import...... 1)模块的定义和分类 1.模块是什么? 我们知道一个函数封装了一个功能,软件可能是有多个函数组成的.我们说一个函数就是一个功能, ...
- Spring Boot -- Spring AOP原理及简单实现
一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...