bzoj 1857 [Scoi2010]传送带

来源:互联网 发布:移动进销存软件 编辑:程序博客网 时间:2024/05/20 22:00

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


Sample Output

136.60

HINT

对于100%的数据,1<=Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10

写的第一道三分啊、、
题目就是分别在AB,CD上面找到两点E、F,使得走完AEFD的时间最小。
一看到题目就想先在CD定一点,然后求AB上面对应的最优点就明显可以用三分了。因为时间关于AE的函数是单谷的。也就是类似开口向上的二次函数。
然后考虑两条线,在CD上面的函数是不是也是单谷的呢?不会证。。。感觉像。。。感觉距离关于FD的长度是连续可导的。。然后不太可能是一会升一会降。。。然后就尝试三分之。。。结果被坑了。。。线段一可能退化成点。。。无语了都。。

不过还是不会证。。求指教、、

ACCODE

program bzoj_1857;
constlim=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;
//=========================================================
functiondist(x,y:dot):extended;
begin
  dist:=sqrt(sqr(x.x-y.x)+sqr(x.y-y.y));
end;
//=========================================================
functiondivide(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;
    ifx<y thenr:=mid2 else l:=mid1;
  untildist(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;
    ifx<y thenr:=mid2 else l:=mid1;
  untildist(l,r)<lim;writeln(x:0:2);
end.

0 0
原创粉丝点击