BZOJ 1857 [Scoi2010]傳送帶 三分套三分
阿新 • • 發佈:2019-01-23
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,ROutput
輸出資料為一行,表示lxhgww從A點走到D點的最短時間,保留到小數點後2位Sample Input
0 0 0 100100 0 100 100
2 2 1
Sample Output
136.60HINT
對於100%的資料,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
#include<bits/stdc++.h>
using namespace std;
const double
eps=1e-4;
double P,Q,R,Ax,Ay,Bx,By,Cx,Cy,Dx,Dy;
double dis(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double Work_CD(double x,double y){
double Lx=Cx,Ly=Cy,Rx=Dx,Ry=Dy;
while (fabs(Lx-Rx)>eps || fabs(Ly-Ry)>eps){
double lxmid=Lx+(Rx-Lx)/3.0,lymid=Ly+(Ry-Ly)/3.0,
rxmid=Lx+(Rx-Lx)/3.0*2.0,rymid=Ly+(Ry-Ly)/3.0*2.0;
if (dis(x,y,lxmid,lymid)/R+dis(Dx,Dy,lxmid,lymid)/Q>
dis(x,y,rxmid,rymid)/R+dis(Dx,Dy,rxmid,rymid)/Q)
Lx=lxmid,Ly=lymid;
else
Rx=rxmid,Ry=rymid;
}
return dis(x,y,Lx,Ly)/R+dis(Dx,Dy,Lx,Ly)/Q;
}
double Work_AB(){
double Lx=Ax,Ly=Ay,Rx=Bx,Ry=By;
while (fabs(Lx-Rx)>eps || fabs(Ly-Ry)>eps){
double lxmid=Lx+(Rx-Lx)/3.0,lymid=Ly+(Ry-Ly)/3.0,
rxmid=Lx+(Rx-Lx)/3.0*2.0,rymid=Ly+(Ry-Ly)/3.0*2.0;
if (dis(Ax,Ay,lxmid,lymid)/P+Work_CD(lxmid,lymid)>
dis(Ax,Ay,rxmid,rymid)/P+Work_CD(rxmid,rymid))
Lx=lxmid,Ly=lymid;
else
Rx=rxmid,Ry=rymid;
}
return dis(Ax,Ay,Lx,Ly)/P+Work_CD(Lx,Ly);
}
int main(){
scanf("%lf%lf%lf%lf",&Ax,&Ay,&Bx,&By);
scanf("%lf%lf%lf%lf",&Cx,&Cy,&Dx,&Dy);
scanf("%lf%lf%lf",&P,&Q,&R);
printf("%.2lf\n",Work_AB());
return 0;
}