「NOI2012」骑行川藏
「NOI2012」骑行川藏
题目描述
蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.
川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行前设定好目的地,同时合理分配好自己的体力是一件非常重要的事情.
由于蛋蛋装备了一辆非常好的自行车,因此在骑行过程中可以认为他仅在克服风阻做功(不受自行车本身摩擦力以及自行车与地面的摩擦力影响).
某一天他打算骑$n$ 段路,每一段内的路况可视为相同:对于第$i$ 段路,我们给出有关这段路况的$3$ 个参数$s_i,k_i,v_i'$ ,其中$s_i$ 表示这段路的长度,$k_i$ 表示这段路的风阻系数,$v_i'$ 表示这段路上的风速($v_i'\gt 0$ 表示在这段路上他遇到了顺风,反之则意味着他将受逆风影响).
若某一时刻在这段路上骑车速度为$v$ ,则他受到的风阻
大小为$F=k_i(v-v_i')^2$ (这样若在长度为$s$ 的路程内保持骑行速度$v$ 不变,则他消耗能量(做功)$E=k_i(v-v_i')^2s$ ).
设蛋蛋在这天开始时的体能值是$E_U$ ,请帮助他设计一种行车方案,使他在有限的体力内用最短的时间到达目的地。请告诉他最短的时间$T$ 是多少.
输入输出格式
输入格式:
第一行包含一个正整数$n$ 和一个实数$E_U$ ,分别表示路段的数量以及蛋蛋的体能值.
接下来$n$ 行分别描述$n$ 个路段,每行有$3$ 个实数$s_i,k_i,v_i'$ 分别表示第$i$ 段路的长度,风阻系数以及风速.
输出格式:
输出一个实数$T$ ,表示蛋蛋到达目的地消耗的最短时间,要求至少保留到小数点后$6$ 位.
输入输出样例
说明
样例说明
一种可能的方案是:蛋蛋在三段路上都采用匀速骑行的方式,其速度依次为$5.12939919,8.03515481,6.17837967$ .
评分方法
本题没有部分分,你程序的输出只有和标准答案的差距不超过$10^{-6}$ 时,才能获得该测试点的满分,否则不得分.
数据规模与约定
对于$10\%$ 的数据,$n=1$ ;
对于$40\%$ 的数据,$n\le2$ ;
对于$60\%$ 的数据,$n\le100$ ;
对于$80\%$ 的数据,$n\le1000$ ;
对于$100\%$ 的数据,$n\le10^4,E_U\le10^8$
$s_i\in(0,10^5],k_i\in(0,15],v_i'\in(-100,100)$ .
数据保证最终的答案不会超过$10^5$ .
提示
必然存在一种最优的体力方案满足:蛋蛋在每段路上都采用匀速骑行的方式.
RabbitHu的题解
考虑\(E=k_i(v-v_i')^2s\)和\(T=\frac{s}{v}\)的函数图像,我们不难有以下思路。
感性思路
一开始,我们可以给所有路段分配一个无穷小的速度。
接下来,我们需要在一些路段上耗费一定能量用来提速,以此缩短一定时间。不同路段上,花费单位能量能缩短的时间(简称“性价比”)是不同的,所以如果我们要模拟这个过程,一定是每时每刻都在当前性价比最高的路段上花费能量,直到能量花完为止。(似乎……也可以花费负的能量,增加某路段所需时间,然后把能量用到别的地方去。)
注意到一个性质:随着花费能量增加,性价比会越来越低。
这样的话,只要按照上面这种贪心策略,时时刻刻在性价比最高的路段花费能量(并使它的性价比降低),最后达到最优解时,各路段性价比会一样。
暴力模拟似乎是写不出来的,考虑更正常的做法。
这个性价比是什么呢?如果我们对每段路画出一个\(t-E\)函数图象,表示该路段需要的时间\(t\)与花费的能量\(E\)的函数关系,那么花费一定能量\(e\)之后的“性价比”是什么呢?就是函数图像上横坐标为\(e\)处切线的斜率——导数。
那么最优解就满足——各路段导数一样!
同时,这个公共导数(是负的)绝对值越小(性价比越低),所需能量越多,总时间越小。
于是二分这个导数,求出每段速度,以此求出所需能量,和手里的总能量比较一下,就可以二分得到答案了!
数学推导
要求出每段导数关于\(v\)的关系。
对于一段路来说(方便起见,把\(k\)乘上\(s\)作为新的\(k\),就可以少写一个字母了):
\]
那么
= -\frac{s}{v^2} / 2k(v - v')\\
= -\frac{s}{2kv^2(v-v')}\]
然后二分公共导数\(x\),对于每段路解方程\(-\frac{s}{2kv^2(v-v')} = x\)(可二分)得到\(v\),进而求出需要的能量。
时间复杂度\(O(n\log^2 v)\)。
#include<bits/stdc++.h>
#define co const
#define il inline
template<class T>T read(){
T x=0,w=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x*w;
}
template<class T>T read(T&x){
return x=read<T>();
}
using namespace std;
co int N=10000+1;
int n;
double E,s[N],k[N],u[N];
double getv(double x,int i){
double l=max(u[i],double(0)),r=1e5,mid;
for(int cnt=60;cnt--;){
mid=(l+r)/2;
if(2*k[i]*x*mid*mid*(mid-u[i])>-s[i]) l=mid;
else r=mid;
}
return (l+r)/2;
}
double calc(double x){
double sum=0;
for(int i=1;i<=n;++i){
double v=getv(x,i);
sum+=k[i]*(v-u[i])*(v-u[i]);
}
return sum;
}
int main(){
scanf("%d%lf",&n,&E);
for(int i=1;i<=n;++i) scanf("%lf%lf%lf",s+i,k+i,u+i),k[i]*=s[i];
double l=-1e9,r=0,mid;
for(int cnt=100;cnt--;){
mid=(l+r)/2;
if(calc(mid)<=E) l=mid;
else r=mid;
}
mid=(l+r)/2;
double ans=0;
for(int i=1;i<=n;++i) ans+=s[i]/getv(mid,i);
printf("%.18lf\n",ans);
return 0;
}
「NOI2012」骑行川藏的更多相关文章
- 【BZOJ2876】【NOI2012】骑行川藏(数学,二分答案)
[BZOJ2876][NOI2012]骑行川藏(数学,二分答案) 题面 BZOJ 题解 我们有一个很有趣的思路. 首先我们给每条边随意的赋一个初值. 当然了,这个初值不会比这条边的风速小. 那么,我们 ...
- BZOJ 2876 【NOI2012】 骑行川藏
题目链接:骑行川藏 听说这道题需要一些高数知识 于是膜了一发dalao的题解……然后就没了…… 不要吐槽我的精度TAT……eps设太小了就TLE,大了就Wa……我二分的边界是对着数据卡的…… 下面贴代 ...
- 【NOI2012】骑行川藏
获得成就:第一次在信竞做神仙数学题 先放个前言,$OI$ 出大型数学题还是比较麻烦的,因为主要是考你数学推导 / 手算式子,你算出来之后把公式套个板子,就得到结论——$OI$ 的大型数学题的代码都是板 ...
- 【BZOJ2876】【Noi2012】骑行川藏 拉格朗日乘法
题目描述 给你 \(n,E,s_i,k_i,v_i'\),要求在 \[ \sum_{i=1}^nk_i{(v_i-v_i')}^2s_i\leq E \] 的前提下最小化 \[ \sum_{i=1}^ ...
- bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
2876: [Noi2012]骑行川藏 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1033 Solved: ...
- 高等数学(拉格朗日乘子法):NOI 2012 骑行川藏
[NOI2012] 骑行川藏 输入文件:bicycling.in 输出文件:bicycling.out 评测插件 时间限制:1 s 内存限制:128 MB NOI2012 Day1 Des ...
- 2876: [Noi2012]骑行川藏 - BZOJ
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- bzoj2876 [Noi2012]骑行川藏
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)
题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...
随机推荐
- [资料]ObjectARX 2020参考指南翻译中文版
chm使用Google Chrome浏览器翻译,有些翻译不是很理想,因为2万5千多个html文件, 修正难度太大,所以只处理了一部分. 非常感谢 gzxl 辛苦肉眼修正一些翻译问题. 欢迎进入QQ群: ...
- flask,scrapy,django信号
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...
- docker+k8s基础篇一
Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...
- 【剑指offer】面试题 24. 反转链表
面试题 24. 反转链表
- watchdog监控文件变化使用总结——转载
原文链接地址:https://blog.csdn.net/xufive/article/details/93847372 概述 首先声明,本文讨论的 watchdog,不是单片机里的 watchdog ...
- springboot2.1.7整合swagger2.9.2
什么是swagger? swagger是用于定义API文档的一个框架. 为什么要使用swagger? 当下项目开发时前后端是分离的,那么接口就成了前后端唯一的纽带.前端工程师如何知道哪个接口是干嘛的? ...
- 手撕面试官系列(二):开源框架面试题Spring+SpringMVC+MyBatis
文章首发于今日头条:https://www.toutiao.com/i6712324863006081549/ 前言 跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看 ...
- Logrotate滚动openresty日志
一.摘要 Linux服务器上我们用Logrotate来分割归档日志文件,结合crond我们可以指定每天在某个时间自动整理日志等文档.本文主要说明了Centos下Logrotate的使用和配置的方法. ...
- [NOIP2018 PJ T4]对称二叉树
题目大意:问一棵有根带权二叉树中最大的对称二叉树子树,对称二叉树为需满足将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 题解:在对称二叉树中,对于深度相同的两个节点$u,v$ ...
- Educational Codeforces Round 66 (Rated for Div. 2)
A.直接模拟. #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...