【bzoj1857】 Scoi2010—传送带
http://www.lydsy.com/JudgeOnline/problem.php?id=1857 (题目链接)
题意
给出两条线段AB和CD,在AB上的速度为P,在CD上的速度为Q,在AB,CD之外的平面上速度为R,求从A到D的最短时间。
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成单峰函数关系。。。
于是就这样挖了个坑。。。最关键的地方还是没有讲到。
代码
// bzoj1857
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
#define eps 1e-9
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
LL x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} int ax,bx,cx,dx,ay,by,cy,dy,p,q,r; double dis(double x1,double y1,double x2,double y2) {
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double cal(double x,double y) {
double x1,y1,x2,y2,t1,t2;
double lx=cx,ly=cy,rx=dx,ry=dy;
while (fabs(lx-rx)>eps || fabs(ly-ry)>eps) {
x1=lx+(rx-lx)/3;x2=lx+(rx-lx)/3*2;
y1=ly+(ry-ly)/3;y2=ly+(ry-ly)/3*2;
t1=dis(ax,ay,x,y)/p+dis(x,y,x1,y1)/r+dis(x1,y1,dx,dy)/q;
t2=dis(ax,ay,x,y)/p+dis(x,y,x2,y2)/r+dis(x2,y2,dx,dy)/q;
if (t1>t2) lx=x1,ly=y1;
else rx=x2,ry=y2;
}
//return min(t1,t2);
return dis(ax,ay,x,y)/p+dis(x,y,lx,ly)/r+dis(lx,ly,dx,dy)/q;
}
int main() {
scanf("%d%d%d%d",&ax,&ay,&bx,&by);
scanf("%d%d%d%d",&cx,&cy,&dx,&dy);
scanf("%d%d%d",&p,&q,&r);
double x1,x2,y1,y2,t1,t2;
double lx=ax,ly=ay,rx=bx,ry=by;
while (fabs(rx-lx)>eps || fabs(ry-ly)>eps) {
x1=lx+(rx-lx)/3;x2=lx+(rx-lx)/3*2;
y1=ly+(ry-ly)/3;y2=ly+(ry-ly)/3*2;
t1=cal(x1,y1);t2=cal(x2,y2);
if (t1>t2) lx=x1,ly=y1;
else rx=x2,ry=y2;
}
printf("%.2f",cal(lx,ly));
//printf("%.2f",min(t1,t2));
return 0;
}
【bzoj1857】 Scoi2010—传送带的更多相关文章
- BZOJ1857 Scoi2010 传送带 【三分】
		
BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...
 - 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)
		
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
 - BZOJ1857 [Scoi2010]传送带  【三分法】
		
题目链接 BZOJ1857 题解 画画图就发现实际上是在\(AB\)上和\(CD\)上分别选两个点\(E\),\(F\),使得\(t_{AE} + t_{EF} + t_{FD}\)最小 然后猜想到当 ...
 - bzoj1857: [Scoi2010]传送带--三分套三分
		
三分套三分模板 貌似只要是单峰函数就可以用三分求解 #include<stdio.h> #include<string.h> #include<algorithm> ...
 - BZOJ1857[SCOI2010]传送带
		
题目大意:平面上两条线段,一个人从一条线段的一个点到另一条线段的一个点,最小时间是多少 路径肯定是在一条线段上走一段,然后走平面,最后再走另一条线段,那么需要确定的就是在两条线段上走的距离,其他暴力算 ...
 - [BZOJ1857][SCOI2010]传送带-[三分]
		
Description 传送门 Solution 三分套三分.代码简单但是证明苦兮兮.. 假如我们在AB上选了一个点G,求到该点到D的最小时间. 图中b与CD垂直.设目前从G到D所耗时间最短的路径为G ...
 - 【BZOJ1857】[Scoi2010]传送带 三分套三分
		
[BZOJ1857][Scoi2010]传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度 ...
 - 【BZOJ-1857】传送带      三分套三分
		
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1077 Solved: 575[Submit][Status][ ...
 - bzoj 1857: [Scoi2010]传送带  三分
		
题目链接 1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 934 Solved: 501[Submit][Stat ...
 - 【BZOJ1857】传送带(三分)
		
[BZOJ1857]传送带(三分) 题面 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P, ...
 
随机推荐
- 怪物彈珠Monster Strike 攻略
			
火>水>木>光>暗 1.每天的曜日素材本,周一暗光,周二火,周参水,周四木,周五光乌龟,都是可以打整天的 2.另外补充,升经验用暗乌龟,切忌切记要塞给他随便一只烂宠升等,再吃掉 ...
 - Fidder--实现手机的抓包
			
今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...
 - 创建租房网House脚本
			
USE MASTER GO EXEC XP_CMDSHELL 'MKDIR E:\HOUSE1' GO SET NOCOUNT ON----不显示影响行数 IF EXISTS(SELECT * FRO ...
 - 编写高效的CSS选择符(节选)
			
最右边优先 css选择符是从右向左进行匹配的. 样式系统从最右边的选择符开始向左匹配规则.只要当前的选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和匹配的元素,或者因为不匹配而退出. ...
 - IBatis.net介绍
			
IBatis.net介绍 IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2. 官方网站: ...
 - 怎么样快速学习AngularJS?
			
其实AngularJS的官方网站首页的几个例子已经很好的展示了AngularJS的一些特性,下面我就从几个例子一步一步的讲解AngularJS吸引人的东西并且实际项目中是怎么使用ng的. 首先还是从第 ...
 - LeetCode:Gray Code(格雷码)
			
题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...
 - iOS中归档对象的创建,数据写入与读取
			
归档(archiving)是指另一种形式的序列化,但它是任何对象都可以实现的更常规的模型.专门编写用于保存数据的任何模型对象都应该支持归档.比属性列表多了很良好的伸缩性,因为无论添加多少对象,将这些对 ...
 - 集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce
			
今天一大早来看到园友分享的福利<分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi>,我也来分享一个吧.以下内容由笔者写 ...
 - css边框阴影
			
<style type="text/css">.mydiv{width:250px;height:auto;border:#909090 1px solid;backg ...