【BZOJ2876】【NOI2012】骑行川藏(数学,二分答案)
【BZOJ2876】【NOI2012】骑行川藏(数学,二分答案)
题面
题解
我们有一个很有趣的思路。
首先我们给每条边随意的赋一个初值。
当然了,这个初值不会比这条边的风速小。
那么,我们可以先计算一下当前所需要的总能量。
剩下的能量我们分成若干等份。
每次从所有的边中,选择一个加了这一份能量后,时间减少最多的那条边,让他提速。
直到我们所有的能量都分配完,此时答案一定最优。
所以,可以简化一下题意。
在\(\sum ks(v'-v)^2=E_U\)的情况下,最小化\(\sum \frac{s}{v}\)
然后剩下的部分我就去看看学长写的吧(因为我也不懂)
MashiroSky's Blog
主要是不知道为什么梯度向量就平行了
补充一下自己的几点理解:
首先能量和等于\(E_U\)是一个函数,我们可以把它先在空间中表示出来。
然后最小化的值我们也可以看成一个函数,那么我们类似于地理中的等高线,
把所有等值的点的位置一圈一圈的全部向外拓展,当它第一次与能量构成的函数相交时,
并且这个交点一定是切点,此时取到的就是最小值了。
梯度向量由偏向量构成,其中偏向量的每一维分别对应这这个函数在每一维上的导数。
也就是把每一维分别看做主元,其他的都看作常量后求导。
也许梯度向量相等可以看做为在切点处,任何一维的增长量都相等?
假设我们默认梯度向量平行
那么,就有\((v_1,v_2,v_3....,v_n)=\lambda (v'_1,v'_2,...,v'_n)\)
我们可以二分这个\(\lambda\),然后求解出所有的速度。
求解速度的时候等价于解方程\(2\lambda Kv^2(v-v')=-1\)
所有已知量都挪到右边,假设算完后的结果是\(c\)
那么就是\(v^3-v'v^2=c\)
我们找左边的零点,发现显然只有两个零点\(v'\)和\(0\)
并且我们最终的速度一定不会小于\(v'\),解方程的时候我们可以二分,
解的下界是\(max(0,v')\)
差不多就这些了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 11111
#define eps 1e-13
int n;
double Eu,S[MAX],K[MAX],V[MAX],v[MAX],ans;
bool check(double lam)
{
double ret=0;
for(int i=1;i<=n;++i)
{
double l=max(0.0,V[i]),r=1e9,c=-1/(2*lam*K[i]);v[i]=l;
while(l+eps<=r)
{
double mid=(l+r)/2;
if(mid*mid*(mid-V[i])<c)l=mid;
else r=mid;
}
v[i]=l;ret+=K[i]*S[i]*(V[i]-v[i])*(V[i]-v[i]);
}
return ret<=Eu;
}
int main()
{
scanf("%d%lf",&n,&Eu);
for(int i=1;i<=n;++i)scanf("%lf%lf%lf",&S[i],&K[i],&V[i]);
double l=-1e9,r=0,ret;
while(l+eps<=r)
{
double mid=(l+r)/2;
if(check(mid))l=mid,ret=mid;
else r=mid;
}
check(ret);
for(int i=1;i<=n;++i)ans+=S[i]/v[i];
printf("%.10lf\n",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 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- [NOI2012] 骑行川藏 | 求导 二分
一个能看的题解!预备知识只有高中数学的[导数].不用什么偏导数/拉格朗日乘子法之类的我看不懂的东西( •̀∀•́ )! 如果你不知道什么是导数,可以找本高中数学选修2-2来看一下!看第一章第1.2节就 ...
- 【bzoj2876】 Noi2012—骑行川藏
http://www.lydsy.com/JudgeOnline/problem.php?id=2876 (题目链接) 题意 在满足约束条件$${\sum_{i=1}^ns_ik_i(v_i-v_i' ...
- bzoj 2876: [Noi2012]骑行川藏【拉格朗日乘数法+二分】
详见: http://blog.csdn.net/popoqqq/article/details/42366599 http://blog.csdn.net/whzzt/article/details ...
- 【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'\),最小化$ \ ...
随机推荐
- Struts 2(五):输入校验 & 校验框架
第一节 Struts2输入校验 1.1 输入校验的重要性 输入校验分为客户端校验和服务器端校验.客户端校验用来过滤用户的错误操作,一般使用JavaScript代码实现.服务器端校验用来防止非法用户的恶 ...
- Python range() 函数用法
函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: ...
- Python之requests的安装
在 windows 系统下,只需要输入命令 pip install requests ,即可安装. 在 linux 系统下,只需要输入命令 sudo pip install requests ,即可安 ...
- NO.3:自学python之路------集合、文件操作、函数
引言 本来计划每周完成一篇Python的自学博客,由于上一篇到这一篇遇到了过年.开学等杂事,导致托更到现在.现在又是一个新的学期,春天也越来越近了(冷到感冒).好了,闲话就说这么多.开始本周的自学Py ...
- rhel6 mysql skip-grant-tables 添加用户报错 ERROR 1290
不小心把数据库密码忘掉了, 这个时候我们只需要在数据库的配置文件里面添加 skip-grant-tables 然后重新启动服务,再登录数据库就不要我们输入密码了 这个时候我成功登录数据,可是不小心又把 ...
- [笔记] mysql5.6一些编译参数
cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE ...
- 实验一 MiniOS
实验一.命令解释程序的编写实验 商软1班 杨晶晶 201406114102 一. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3)掌握C语言编程初 ...
- Scrum立会报告+燃尽图(十一月二十一日总第二十九次):β阶段第二周分配任务
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- Android:有关菜单的学习(供自己参考)
Android:有关==菜单==的学习 上下文菜单 上下文菜单就是手机中对某一项进行==点击一定时间==后弹出的针对该项处理的菜单. context_menu.xml: <?xml versio ...
- Android开发第二阶段(1)
今天:总结第一阶段的冲刺成果,第一阶段就是主要是学习andriod开发,参考文件有<黑马教学视频><Mars教学视频>...结果在看的过程遇到很多问题特别是对java的一些理解 ...