三分學習筆記 [SCOI2010]傳送帶
阿新 • • 發佈:2018-11-02
在一個2維平面上有兩條傳送帶,每一條傳送帶可以看成是一條線段。兩條傳送帶分別為線段AB和線段CD。lxhgww在AB上的移動速度為P,在CD上的移動速度為Q,在平面上的移動速度R。現在lxhgww想從A點走到D點,他想知道最少需要走多長時間
終於敢說我會三分了
本題是三分套三分的經典例題
分別在兩個線段上三分就好了
注意精度(不要被炸成-nan)
#include<bits/stdc++.h> using namespace std; const double eps=1e-4; struct Point{ double x,y; void read(){ cin>>x>>y; } }; double GetDis(Point A,Point B){ return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); } struct Line{ Point A,B; double dis; void read(){ A.read(); B.read(); dis=GetDis(A,B); } Point Get_Half(double len){ if(dis-len<eps)return B; if(len<eps)return A; double k=len/(dis); Point ret; ret.x=(B.x-A.x); ret.y=(B.y-A.y); ret.x*=k; ret.y*=k; ret.x+=A.x; ret.y+=A.y; return ret; } }L1,L2; double P,Q,R; double f(Point A,double sum){ Point S=L2.Get_Half(sum); return GetDis(A,S)/R+GetDis(S,L2.B)/Q; } double Get(double sum){ Point S=L1.Get_Half(sum); double l=0.00; double r=L2.dis; while(r-l>eps){ double rr=l+(r-l)/3.0*2; double ll=l+(r-l)/3.0; if(f(S,rr)<f(S,ll)){ l=ll; } else r=rr; } return f(S,l)+GetDis(L1.A,S)/P; } int main(){ // freopen("test.in","r",stdin); L1.read(); L2.read(); cin>>P>>Q>>R; double l=0.00; double r=L1.dis; while(r-l>eps){ double rr=l+(r-l)/3.0*2; double ll=l+(r-l)/3.0; if(Get(rr)<Get(ll)){ l=ll; } else r=rr; } cout<<fixed<<setprecision(2)<<Get(l); }