这个毒瘤题
原题链接
题目描述
在一个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位
样例输入 Copy
0 0 0 100
100 0 100 100
2 2 1
样例输出 Copy
136.60
提示
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000,1<=P,Q,R<=10
解题思路:
在线段AB和线段CD分别选一个点E,F。假设所需的最短时间的路径为:A->E->F->D。假设E点已经找到,然后线段CD上三分寻找F点的位置,使得E->F->D的时间最小。然后在线段AB上三分E点的位置,最后将两段的时间加起来就是最小的时间。
证明看这个
代码:
#include<bits/stdc++.h> using namespace std; double xa,ya,xb,yb,xc,yc,xd,yd,p,q,r; double dis(double x1,double y1,double x2,double y2){ //return fabs(x1-x2)+fabs(y1-y2); return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double check(double x,double y){ double xl=xc,yl=yc,xr=xd,yr=yd; while(fabs(xr-xl)>1e-8||fabs(yr-yl)>1e-8){ double xmid1=xl+(xr-xl)/3,ymid1=yl+(yr-yl)/3; double xmid2=xr-(xr-xl)/3,ymid2=yr-(yr-yl)/3; double t1=dis(xa,ya,x,y)/p+dis(x,y,xmid1,ymid1)/r+dis(xmid1,ymid1,xd,yd)/q; double t2=dis(xa,ya,x,y)/p+dis(x,y,xmid2,ymid2)/r+dis(xmid2,ymid2,xd,yd)/q; if(t1<t2) xr=xmid2,yr=ymid2; else xl=xmid1,yl=ymid1; } return dis(xa,ya,x,y)/p+dis(x,y,xl,yl)/r+dis(xl,yl,xd,yd)/q; } int main(){ cin>>xa>>ya>>xb>>yb>>xc>>yc>>xd>>yd>>p>>q>>r; double xl=xa,yl=ya,xr=xb,yr=yb; while(fabs(xr-xl)>1e-8||fabs(yr-yl)>1e-8){ double xmid1=xl+(xr-xl)/3,ymid1=yl+(yr-yl)/3; double xmid2=xr-(xr-xl)/3,ymid2=yr-(yr-yl)/3; if(check(xmid1,ymid1)<check(xmid2,ymid2)) xr=xmid2,yr=ymid2; else xl=xmid1,yl=ymid1; } printf("%.2lf",check(xl,yl)); return 0; }
萌新报道,欢迎指正~