P2179-[NOI2012]骑行川藏【导数,二分】
正题
题目链接:https://www.luogu.com.cn/problem/P2179
题目大意
给出\(E\)和\(n\)个\(s_i,k_i,u_i\)求一个序列\(v_i\)满足
\]
的情况下最小化
\]
\(1\leq n\leq 10^4\)
解题思路
洛谷题解上一个十分神奇的做法看起来。(主要是看不懂拉格朗日乘数法/kk)
首先考虑对于段路的行驶时间\(t_i=\frac{s_i}{v_i}\),我们可以画出消耗的能量\(E\)和\(t_i\)的函数。
对于函数\(f(E)=t_i\)不难发现的是在\(v_i\geq u_i\)的情况下\(E\)越小这个函数对应位置的导数越小。
也就是消耗单位能量减少的时间也就越少,性价比就越低。而我们现在要给每段路分配一个\(t_i\)使得消耗能量和等于\(E\)且\(t_i\)和最小的话。
根据贪心的思想有选出若干个的\(t_i\)满足对应位置的导数相等。
那么我们就找到了所有路的共性,考虑二分这个导数,但是我们先对这个函数\(f(v)=\frac{t}{E}\)求个导。
\]
\]
然后我们二分出\(f'(v_i)=x\)然后再二分出对应的速度\(v_i\)就好了。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
int n;double E,s[N],k[N],v[N];
double getv(double x,int p){
double l=max(v[p],0.0),r=100000;
for(int i=1;i<=100;i++){
double V=(l+r)/2.0;
if(-2.0*k[p]*V*V*x*(V-v[p])<1.0)l=V;
else r=V;
}
return (l+r)/2.0;
}
double check(double x){
double E=0;
for(int i=1;i<=n;i++){
double V=getv(x,i);
E+=k[i]*s[i]*(V-v[i])*(V-v[i]);
}
return E;
}
int main()
{
scanf("%d",&n);scanf("%lf",&E);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&s[i],&k[i],&v[i]);
double l=-1e5,r=0;
for(int i=1;i<=100;i++){
double mid=(l+r)/2.0;
if(check(mid)<=E)l=mid;
else r=mid;
}
double mid=(l+r)/2.0,ans=0;
for(int i=1;i<=n;i++)
ans+=s[i]/getv(mid,i);
printf("%.12lf\n",ans);
return 0;
}
P2179-[NOI2012]骑行川藏【导数,二分】的更多相关文章
- Luogu P2179 [NOI2012]骑行川藏
题意 给定 \(n\) 个路段,每个路段用三个实数 \(s_i,k_i,v^\prime_i\) 描述,最小化 \[F(v_1,\cdots v_n)=\sum\limits_{i=1}^{n}\fr ...
- 【洛谷】P2179 [NOI2012]骑行川藏
题解 感谢小迪给我讲题啊,这题小迪写挺好的我就不写了吧 小迪的题解 代码 #include <iostream> #include <cstdio> #include < ...
- 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)
题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...
- bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
2876: [Noi2012]骑行川藏 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1033 Solved: ...
- 2876: [Noi2012]骑行川藏 - BZOJ
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- bzoj2876 [Noi2012]骑行川藏
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)
题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...
- [NOI2012] 骑行川藏 | 求导 二分
一个能看的题解!预备知识只有高中数学的[导数].不用什么偏导数/拉格朗日乘子法之类的我看不懂的东西( •̀∀•́ )! 如果你不知道什么是导数,可以找本高中数学选修2-2来看一下!看第一章第1.2节就 ...
- bzoj 2876: [Noi2012]骑行川藏【拉格朗日乘数法+二分】
详见: http://blog.csdn.net/popoqqq/article/details/42366599 http://blog.csdn.net/whzzt/article/details ...
- 题解 洛谷 P2179 【[NOI2012]骑行川藏】
题意为在满足\(\sum\limits_{i=1}^nk_i(v_i-v_i^\prime)^2s_i\leqslant E_U\)的条件下最小化\(\sum\limits_{i=1}^n\frac{ ...
随机推荐
- yield 关键字的认知
namespace ConsoleDemo{ class Program { static void Main(string[] args) { string[] str = { "1&qu ...
- Qt MDI及其使用方法(详解版)
统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt 为设计 MDI 应用程序提供了支持. 本节的实例 samp6_4 是一个 MDI 应用程序,程 ...
- C语言判断两个值相等
内置类型比较直接用==判断 字符串比较要用string.h里的函数strcmp(const char *str1,const char *str2)进行比较string.h里的函数strcmp(con ...
- mysql各个版本驱动jar包下载 mysql/mysql-connector-java/5.1.22
想下个jar csdn上全是要积分下载,这里记录下 下载地址,免得到时又要找 http://central.maven.org/maven2/mysql/mysql-connector-java/
- 解决->maven下载失败bug
一.前言: 经过一个下午的奋斗(谷歌,视频...重装)后终,于暂时解决了上一篇文章中的bug 传送门:https://blog.csdn.net/weixin_44092288/article/det ...
- UNION / UNION ALL 区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 使用union all: select top 5 ...
- chrome插件开发学习(一)
两个不错的网址: 360chrome插件开发文档:http://open.chrome.360.cn/extension_dev/manifest.html 图灵 chrome插件开发于应用 电子书: ...
- python 修改图像大小和分辨率
1 概念: 分辨率,指的是图像或者显示屏在长和宽上各拥有的像素个数.比如一张照片分辨率为1920x1080,意思是这张照片是由横向1920个像素点和纵向1080个像素点构成,一共包含了1920x108 ...
- Linux常用命令 - nl命令详解
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 显示行 ...
- jvm学习笔记:栈帧
栈帧内的数据结构 局部变量表(Local Variables):记录非静态方法的this指针.方法参数.局部变量 操作数栈(Operand Stack):用于计算的栈结构 动态链接(Dynamic L ...