Description
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间
Input
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R
Output
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
Sample Input
0 0 0 100
100 0 100 100
2 2 1
100 0 100 100
2 2 1
Sample Output
136.60
HINT
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=10001<=P,Q,R<=10
写的第一道三分啊、、
题目就是分别在AB,CD上面找到两点E、F,使得走完AEFD的时间最小。
一看到题目就想先在CD定一点,然后求AB上面对应的最优点就明显可以用三分了。因为时间关于AE的函数是单谷的。也就是类似开口向上的二次函数。
然后考虑两条线,在CD上面的函数是不是也是单谷的呢?不会证。。。感觉像。。。感觉距离关于FD的长度是连续可导的。。然后不太可能是一会升一会降。。。然后就尝试三分之。。。结果被坑了。。。线段一可能退化成点。。。无语了都。。
不过还是不会证。。求指教、、
AC CODE
program
bzoj_1857;
const
lim=1e-
12
;
type
dot=
record
x,y:
extended
;
end
;
var
a,b,c,d,l,r,mid1,mid2:dot;
x,y,secx,secy,p,q,o:
extended
;
//=========================================================
function
dist(x,y:dot):
extended
;
begin
dist:=sqrt(sqr(x
.
x-y
.
x)+sqr(x
.
y-y
.
y));
end
;
//=========================================================
function
divide(fin:dot):
extended
;
var
mid1,mid2,l,r:dot;
secx,secy,x,y:
extended
;
begin
l:=a; r:=b;
repeat
secx:=(r
.
x-l
.
x)/
3
; secy:=(r
.
y-l
.
y)/
3
;
mid1
.
x:=l
.
x+secx; mid1
.
y:=l
.
y+secy;
mid2
.
x:=r
.
x-secx; mid2
.
y:=r
.
y-secy;
x:=dist(a,mid1)/p+dist(mid1,fin)/o;
y:=dist(a,mid2)/p+dist(mid2,fin)/o;
if
x<y
then
r:=mid2
else
l:=mid1;
until
dist(l,r)<lim; exit(x);
end
;
//=========================================================
begin
readln(a
.
x,a
.
y,b
.
x,b
.
y);
readln(c
.
x,c
.
y,d
.
x,d
.
y);
readln(p,q,o);
l:=c; r:=d;
repeat
secx:=(r
.
x-l
.
x)/
3
; secy:=(r
.
y-l
.
y)/
3
;
mid1
.
x:=l
.
x+secx; mid1
.
y:=l
.
y+secy;
mid2
.
x:=r
.
x-secx; mid2
.
y:=r
.
y-secy;
x:=divide(mid1)+dist(mid1,d)/q;
y:=divide(mid2)+dist(mid2,d)/q;
if
x<y
then
r:=mid2
else
l:=mid1;
until
dist(l,r)<lim;
writeln
(x:
0
:
2
);
end
.