「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$ 位.

输入输出样例

输入样例#1:
复制

3 10000
10000 10 5
20000 15 8
50000 5 6
输出样例#1:
复制

12531.34496464

说明

样例说明

一种可能的方案是:蛋蛋在三段路上都采用匀速骑行的方式,其速度依次为$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\),就可以少写一个字母了):

\[E = k(v - v')^2$$ $$t = \frac{s}{v}
\]

那么

\[\frac{dt}{dE}=\frac{dt}{dv} / \frac{dE}{dv}\\
= -\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」骑行川藏的更多相关文章

  1. 【BZOJ2876】【NOI2012】骑行川藏(数学,二分答案)

    [BZOJ2876][NOI2012]骑行川藏(数学,二分答案) 题面 BZOJ 题解 我们有一个很有趣的思路. 首先我们给每条边随意的赋一个初值. 当然了,这个初值不会比这条边的风速小. 那么,我们 ...

  2. BZOJ 2876 【NOI2012】 骑行川藏

    题目链接:骑行川藏 听说这道题需要一些高数知识 于是膜了一发dalao的题解……然后就没了…… 不要吐槽我的精度TAT……eps设太小了就TLE,大了就Wa……我二分的边界是对着数据卡的…… 下面贴代 ...

  3. 【NOI2012】骑行川藏

    获得成就:第一次在信竞做神仙数学题 先放个前言,$OI$ 出大型数学题还是比较麻烦的,因为主要是考你数学推导 / 手算式子,你算出来之后把公式套个板子,就得到结论——$OI$ 的大型数学题的代码都是板 ...

  4. 【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}^ ...

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

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

  6. 高等数学(拉格朗日乘子法):NOI 2012 骑行川藏

    [NOI2012] 骑行川藏 输入文件:bicycling.in   输出文件:bicycling.out   评测插件 时间限制:1 s   内存限制:128 MB NOI2012 Day1 Des ...

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

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

  8. bzoj2876 [Noi2012]骑行川藏

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

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

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

随机推荐

  1. 利用VBA来实现,输入日文之后,输出它的假名即读法

    背景:当你输日文汉字的额时候,输出它的读音. 如下图所示 实现的代码如下 Option Explicit ' Replace を まとめて おこなう Private Function ReplaceA ...

  2. CF-Technocup3 D Optimal Subsequences

    D Optimal Subsequences http://codeforces.com/contest/1227/problem/D2 显然,每次求的k一定是这个序列从大到小排序后前k大的元素. 考 ...

  3. python的安装与配置

    pyhton的下载与安装 1.python官网地址:https://www.python.org 2.下载 Python 编辑器PyCharm PyCharm 是一款功能强大的 Python 编辑器 ...

  4. java8新特性五-Stream

    继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式. Java 8 A ...

  5. LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)

    151. 翻转字符串里的单词 151. Reverse Words in a String

  6. sql查询出现1055 this is incompatible with sql_mode=only_full_group_by

    今天在测试服务器上突然出现了这么一个MySQL的问题,同样的代码正式服没有问题,那肯定就是出在了配置上,查了一下原因才明白原来是数据库版本为5.7以上的版本, 默认是开启了 only_full_gro ...

  7. Word 中直引号和弯引号的相互替换

    直引号替换成弯引号 弯引号替换成直引号 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)

  8. django 请求 与 响应

    目录 请求(HttpRequest) 与 响应(HttpResponse) HttpRequest对象 请求相关的常用值 属性 HttpResponse对象 JsonResponse对象 render ...

  9. flask框架(四)——flask CBV视图类解析

    CBV视图类的两种基本写法 #第一种写法class IndexView(views.View): methods = ['GET'] decorators = [auth, ] def dispatc ...

  10. AVR单片机教程——拨动开关

    在按键的上方有4个拨动开关.开关与按键,在原理和使用方法上都是很类似的,但有不同的用途——按键按下后松开就会弹起,而开关可以保存其状态. <switch.h> 定义了与开关相关的函数.sw ...