hdu 3400 Line belt

来源:互联网 发布:红警3 for mac版 编辑:程序博客网 时间:2024/05/17 19:21

这道题,设AB上走到M处,CD上走到N处,然后得到AM===MN====ND的时间,先三分M,再三分D,至于为什么。。。

感受一下情况1假设AB走的M越远,到N就越短,然后就满足三分条件

2.AB走的越近到N越短的话,直接三分到A,就是不走AB。

最后CD上同理,于是就是三分套三分。

pqr的速度都不用考虑的,反正三分能求出最值。

#include<cstdio>#include<cstring>#include<cmath> #define eps 1e-7using namespace std;//http://www.cnblogs.com/newpanderking/archive/2011/08/27/2155430.htmlstruct point{double x,y;};double p,q,v;double dis(point a,point b){return sqrt(pow((a.y-b.y),2)+pow(a.x-b.x,2));}double findy(point c,point d,point y){    point mid,midmid,left,right;    double t1,t2;    left = c;    right = d;    do    {        mid.x = (left.x+right.x)/2;        mid.y = (left.y+right.y)/2;        midmid.x = (right.x+mid.x)/2;        midmid.y = (right.y+mid.y)/2;        t1 = dis(d,mid)/q+dis(mid,y)/v;        t2 = dis(d,midmid)/q+dis(midmid,y)/v;        if(t1>t2)        left = mid;        else right = midmid;    }while(fabs(t1-t2)>0.000001);    return t1;}double find(point a,point b,point c,point d){    point mid,midmid,left,right;    double t1,t2;    left = a;    right = b;    do    {        mid.x = (left.x+right.x)/2;        mid.y = (left.y+right.y)/2;        midmid.x = (right.x+mid.x)/2;        midmid.y = (right.y+mid.y)/2;        t1 = dis(a,mid)/p+findy(c,d,mid);        t2 = dis(a,midmid)/p+findy(c,d,midmid);        if(t1>t2)left = mid;        else right = midmid;    }while(fabs(t1-t2)>0.000001);    return t1;}int main(){int t;point a,b,c,d;scanf("%d",&t);for(int i=1;i<=t;i++){scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);scanf("%lf%lf%lf",&p,&q,&v);printf("%.2f\n",find(a,b,c,d));}return 0;}



原创粉丝点击