bzoj 1857 [Scoi2010]传送带

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的长度是连续可导的。。然后不太可能是一会升一会降。。。然后就尝试三分之。。。结果被坑了。。。线段一可能退化成点。。。无语了都。。

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

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 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值