洛谷P2571 [SCOI2010]传送带
题目描述
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间
输入输出格式
输入格式:
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By
第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy
第三行是3个整数,分别是P,Q,R
输出格式:
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
输入输出样例
说明
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
/* 这道题简单一点的话来说就是三分套三分 首先三分AB上的点 这个点设为E 然后通过点E三分CD上的点F 这样不断地缩小范围就可以了 */ #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; const double dec=0.00001; double xa,ya,xb,yb,xc,yc,xd,yd; double q,p,r; double count(double xe,double ye,double xf,double yf) { return ((sqrt((xe-xa)*(xe-xa)+(ye-ya)*(ye-ya)))/p)+((sqrt((xf-xe)*(xf-xe)+(ye-yf)*(ye-yf)))/r)+((sqrt((xd-xf)*(xd-xf)+(yd-yf)*(yd-yf)))/q); } double narrow(double x,double y) { double fcx=xc,fdx=xd,fcy=yc,fdy=yd;double minn; while(fabs(fcx-fdx)>dec||fabs(fcy-fdy)>dec) { double midx=(fcx+fdx)/2,midy=(fcy+fdy)/2; double remidx=(midx+fdx)/2,remidy=(midy+fdy)/2; double ans1=count(x,y,midx,midy),ans2=count(x,y,remidx,remidy); if(ans1>ans2) fcx=midx,fcy=midy; else fdx=remidx,fdy=remidy; minn=min(ans1,ans2); } return minn; } int main() { scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd,&p,&q,&r); double fax=xa,fbx=xb,fay=ya,fby=yb;double minn; while(1) { double midx=(fax+fbx)/2,midy=(fay+fby)/2; double remidx=(midx+fbx)/2,remidy=(midy+fby)/2; double ans1=narrow(midx,midy),ans2=narrow(remidx,remidy); if(ans1>ans2) fax=midx,fay=midy; else fbx=remidx,fby=remidy; minn=min(ans1,ans2); if(fabs(fax-fbx)<dec&&fabs(fay-fby)<dec) break; } printf("%.2lf",minn); return 0; }