【题解】 [SCOI2010]传送带 (三分法)
题目描述
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间
输入输出格式
输入格式:
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By
第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy
第三行是3个整数,分别是P,Q,R
输出格式:
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
输入输出样例
说明
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
Solution
三分套三分。
三分法是个很基础的东西,当问题的答案呈现出的函数图像是单峰的那么就可以使用三分法求出它的最值,具体操作与二分法差不多。
可这道题为什么可以用三分法呢,也就是说它为什么是单峰的,我也不会= =,果断翻题解。
首先,我们用三分法,最基本的是要证明那个人一定是沿着如下路径走的:从A沿着AB走一段,再穿越到CD上某一点,最后到终点。证明如下:不妨假设p>q>r,因为当r>max(p,q)时没什么好讨论的,而p,q的大小没什么关系。那么假设这人从AB上一点X离开,那么如果它不沿着刚刚的路径,则它一定会沿着某个路径回到AB上一点Y,显然X->Y的最快方法是沿着AB走,因为这样距离最短而速度最快。证完。
那么,如果我们假设它从AB上一点X出发到CD上一点Y再到终点,那么当X为定点时,时间与CY长度是成单峰函数的,证明如下:
当s>=q时,显然时间随着CY的增大而减小,显然是单峰函数,因此不妨设s<q。过点X作XH⊥CD,显然当Y在CH上时时间增大,不做讨论。当Y在HD上时,设XH=h,HY=t,那么Y点比D点的时间节约(当Y点比D点时间长时该式为负号):t/q-(sqrt(t^2+h^2)-h)/s=t/q+h/s-sqrt(t^2+h^2)/s,显然sqrt(t^2+h^2)增长是没有t的增长快的,因此一开始该式为正数,时间减少;但是当t增大时,sqrt(t^2+h^2)的增大速度不断变快最终趋向于t的增大速度,不要忘了q>s,所以该式最终会变为负数并且一定会越变越小,时间不断增大。综上所述:时间先单调递减再单调递增,证完。
然而我并不会证明从AB上一点X离开的最优时间,这个函数与AX成单峰函数关系。。。
于是就这样挖了个坑。。。最关键的地方还是没有讲到。
证明单调性貌似有点困难,但证明一边的凹函数还是不难的!
Code:
//It is coded by Ning_Mew on 2.28
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define dd double
using namespace std;
const dd cnt=0.00000001;
int ax,ay,bx,by,cx,cy,dx,dy;
int p,q,r;
dd dist(dd x1,dd y1,dd x2,dd y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
dd fabs(dd x){return x<?-x:x;}
dd getans(dd x,dd y){
dd xl=cx,xr=dx,yl=cy,yr=dy;
dd x1,x2,y1,y2,t1,t2;
while(fabs(xl-xr)>cnt||fabs(yl-yr)>cnt){
x1=xl+(xr-xl)/; y1=yl+(yr-yl)/;
x2=xl+(xr-xl)/*;y2=yl+(yr-yl)/*;
t1=dist(1.0*ax,1.0*ay,x,y)/p+dist(x,y,x1,y1)/r+dist(x1,y1,1.0*dx,1.0*dy)/q;
t2=dist(1.0*ax,1.0*ay,x,y)/p+dist(x,y,x2,y2)/r+dist(x2,y2,1.0*dx,1.0*dy)/q;
if(t1<=t2){xr=x2;yr=y2;}
else {xl=x1;yl=y1;}
}
return dist(1.0*ax,1.0*ay,x,y)/p+dist(x,y,xl,yl)/r+dist(xl,yl,1.0*dx,1.0*dy)/q;
} int main(){
scanf("%d%d%d%d%d%d%d%d",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy);
scanf("%d%d%d",&p,&q,&r);
dd x1,x2,y1,y2,t1,t2;
dd xl,xr,yl,yr;
xl=ax;yl=ay;xr=bx;yr=by;
while(fabs(xl-xr)>cnt||fabs(yl-yr)>cnt){
x1=xl+(xr-xl)/; y1=yl+(yr-yl)/;
x2=xl+(xr-xl)/*;y2=yl+(yr-yl)/*;
t1=getans(x1,y1);t2=getans(x2,y2);
if(t1>t2){xl=x1;yl=y1;}
else {xr=x2;yr=y2;}
}
printf("%0.2f\n",getans(xl,yl));
return ;
}
【题解】 [SCOI2010]传送带 (三分法)的更多相关文章
- [SCOI2010]传送带 三分法
[SCOI2010]传送带 LG传送门 三分法模板. 关于为什么可以三分,我选择感性理解,有人证明了,总之我是懒得证了. 假设路径是\(A \to E \to F \to D\),\(E\)和\(F\ ...
- 【BZOJ1857】[Scoi2010]传送带 三分法
三分套三分,挺神奇的...每次找到,每个传送带的上下两个三等分点,下面那个小,则一定有更优的在中间. #include <iostream> #include <cstdio> ...
- P2571 [SCOI2010]传送带
P2571 [SCOI2010]传送带 三分套三分. 前提条件:P3382 [模板]三分法 三分,求区间内单峰函数的最大/最小值. 我们把两条线段都跑三分,先ab后cd,求出最小值. 可以直接将二维坐 ...
- 【BZOJ1857】[Scoi2010]传送带 三分套三分
[BZOJ1857][Scoi2010]传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度 ...
- 【解题报告】洛谷 P2571 [SCOI2010]传送带
[解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...
- P2571 [SCOI2010]传送带——hyl天梦
P2571 [SCOI2010]传送带题解----天梦 如写的不好,请多见谅. 对于这道题,我首先想说,确实困惑了我好久,看网上的各种题解,却都不尽人意,思路早已明白,却不会操作.最后想想,还是觉得自 ...
- NC20276 [SCOI2010]传送带
NC20276 [SCOI2010]传送带 题目 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD ...
- bzoj 1857: [Scoi2010]传送带 三分
题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 934 Solved: 501[Submit][Stat ...
- 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
- BZOJ1857 Scoi2010 传送带 【三分】
BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...
随机推荐
- gcc 动态编译 动态库路径
gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...
- [POI2007]旅游景点atr BZOJ1097
分析: 我们可以考虑,因为我们必须经过这些节点,那么我们可以将它状压,并且我们因为可以重复走,只是要求停顿前后,不要求遍历前后,那么我们之间存一下点与点之间的最短路,之后每次转移一下就可以了. f[i ...
- 基于多进程和基于多线程服务器的优缺点及nginx服务器的启动过程
基于多进程服务器的优点: 1.由操作系统进行调度,运行比较稳定强壮 2.能够方便地通过操作系统进行监控和管理 例如对每个进程的内存变化状况,甚至某个进程处理什么web请求进行监控.同时可以通过给进程发 ...
- redis系列--redis4.0深入持久化
前言 在之前的博文中已经详细的介绍了redis4.0基础部分,并且在memcache和redis对比中提及redis提供可靠的数据持久化方案,而memcache没有数据持久化方案,本篇博文将详细介绍r ...
- python中获取执行脚本路径方法
1.sys.path[0]:获取执行脚本目录绝对路径 #每次执行脚本时,python会将执行脚本目录加入PYTHONPATH环境变量中(sys.path获取) #!/usr/bin/python3 i ...
- [CF966F]May Holidays[分块+虚树]
题意 给定 \(n\) 个点的树,初始所有颜色都是 \(0\) ,每个点有一个阈值 \(t\) ,每次可能会让一个点的颜色异或1,问每次操作之后有多少个点满足子树内的颜色为 \(1\) 的点的个数 \ ...
- JavaScript快速入门-ECMAScript本地对象(RexExp)
一.概述 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 正则表达式是由一个字符序列形成的搜索模式. 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容. 正则表达式 ...
- effective c++ 笔记 (45-48)
//#45 运用成员函数模版接受所有兼容类型 { /* 1:当你使用智能指针的时候,会发生一个问题,想把一个子类的对象赋给基类的指针变得不可能了, 因为智能指针指定了的是基类的类型,而赋给它的是 ...
- 代理神器allproxy
背景 allproxy意为all as proxy,即是说所有设备均可以成为一个网络代理,唯一的要求就是有网络访问权限. 一般的代理软件要求宿主机必须有公网地址,然后才能把网络代理出去,但在实际情况下 ...
- Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果
Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果 梗概: 一. 摄像机围绕目标物体旋转, 即摄像机离目标物体有一定的距离且旋转轴心为该物体的位置. 二. 当目标物体被障碍物挡住后, 需要将摄像机 ...