Line belt
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2782 Accepted Submission(s): 1062
Problem Description
In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the speed R on other area on the plane.
How long must he take to travel from A to D?
How long must he take to travel from A to D?
Input
The first line is the case number T.
For each case, there are three lines.
The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
The third line, three integers, P Q R.
0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
For each case, there are three lines.
The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
The third line, three integers, P Q R.
0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
Output
The minimum time to travel from A to D, round to two decimals.
Sample Input
1 0 0 0 100 100 0 100 100 2 2 1
Sample Output
136.60解决方案:先对AB三分,再对CD三分,AB三分在外层,CD三分在内层。求距离是要注意先加个eps再开放,防止开方结果比真实值小。code:#include <iostream> #include<cstdio> #include<cmath> using namespace std; double dist(double ax,double ay,double bx,double by) { return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)+0.0000001); } double Ax,Ay,Bx,By,Cx,Cy,Dx,Dy; double P,Q,R; double AB,CD; double ax; double by; double cal2(double mid) { double cx=(Dx-Cx)*(mid/CD)+Cx; double dy=(Dy-Cy)*(mid/CD)+Cy; double sum1=dist(ax,by,cx,dy); sum1=sum1/R; sum1+=(CD-mid)/Q; return sum1; } double cal(double Mid) { double sum=Mid/P; ax=(Bx-Ax)*(Mid/AB)+Ax; by=(By-Ay)*(Mid/AB)+Ay; CD=dist(Cx,Cy,Dx,Dy); double left=0.0,right=CD,mid,midmid,midv,midmidv; while(fabs(right-left)>0.000000001) { mid=(right+left)/2.0; midmid=(right+mid)/2.0; midv=cal2(mid); midmidv=cal2(midmid); if(midv<=midmidv) { right=midmid; } else left=mid; } return sum+cal2(left); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &Ax,&Ay,&Bx,&By,&Cx,&Cy,&Dx,&Dy); scanf("%lf%lf%lf",&P,&Q,&R); AB=dist(Ax,Ay,Bx,By); double left=0.0,right=AB,mid,midmid,midv,midmidv; while(fabs(right-left)>0.000000001) { mid=(right+left)/2.0; midmid=(mid+right)/2.0; midv=cal(mid); midmidv=cal(midmid); if(midv<=midmidv) { right=midmid; } else left=mid; } double s=cal(left); printf("%.2lf\n",s); } return 0; }