bzoj 1857: [Scoi2010]传送带

Time Limit: 1 Sec  Memory Limit: 64 MB

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

解:三分套三分;

#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const double eps=1e-3;
double as(double a){if(a>=0) return a;return -a;}
int xa,ya,xb,yb,xc,yc,xd,yd,p,q,r;
inline double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
inline double get(double x,double y)
{
    double lx=xc,ly=yc,rx=xd,ry=yd;
    double x1,x2,y1,y2,t1,t2;
    while(as(lx-rx)>eps||as(ly-ry)>eps)
    {
        x1=lx+(rx-lx)/3,  y1=ly+(ry-ly)/3;
        x2=lx+(rx-lx)/3*2,y2=ly+(ry-ly)/3*2;
        t1=dis(xa,ya,x,y)/p+dis(x,y,x1,y1)/r+dis(x1,y1,xd,yd)/q;
        t2=dis(xa,ya,x,y)/p+dis(x,y,x2,y2)/r+dis(x2,y2,xd,yd)/q;
        if(t1>t2) lx=x1,ly=y1;
        else rx=x2,ry=y2;
    }
    return dis(xa,ya,x,y)/p+dis(x,y,lx,ly)/r+dis(lx,ly,xd,yd)/q;
}
int main()
{
    scanf("%d %d %d %d %d %d %d %d %d %d %d",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd,&p,&q,&r);
    double lx=xa,ly=ya,rx=xb,ry=yb;
    double x1,x2,y1,y2,t1,t2;
    while(as(lx-rx)>eps||as(ly-ry)>eps)
    {
        x1=lx+(rx-lx)/3,y1=ly+(ry-ly)/3;
        x2=lx+(rx-lx)/3*2,y2=ly+(ry-ly)/3*2;
        t1=get(x1,y1),t2=get(x2,y2);
        if(t1>t2) lx=x1,ly=y1;
        else rx=x2,ry=y2;
    }
    printf("%.2lf",get(lx,ly));
    return 0;
}
bzoj 1857

=-=======================

posted @ 2017-10-26 20:10  12fs  阅读(228)  评论(0编辑  收藏  举报