P2571 [SCOI2010]傳送帶 三分
阿新 • • 發佈:2020-09-16
題意:
在一個 2 維平面上有兩條傳送帶,每一條傳送帶可以看成是一條線段。兩條傳送帶分別為線段 \(AB\) 和線段 \(CD\)。lxhgww 在 \(AB\) 上的移動速度為 \(p\),在 \(CD\) 上的移動速度為 \(Q\),在平面上的移動速度 \(R\)。現在 lxhgww 想從 \(A\) 點走到 \(D\) 點,他想知道最少需要走多長時間。
範圍&性質: \(1\le a_x,a_y,b_x,b_y,c_x,c_y,d_x,d_y \le 10^3,1\le p,q,r\le 10\)
分析:
題目相當於在\(AB,CD\)上分別求出一個點\(E,F\),使得\(\frac{dis(A,E)}{p}+\frac{dis(E,F)}{r}+\frac{dis(F,d)}{q}\)
程式碼:
#include<bits/stdc++.h> using namespace std; namespace zzc { const double eps = 1e-6; double p,q,r; double ax,ay,bx,by,cx,cy,dx,dy; double dis(double x1,double y1,double x2,double y2) { return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double tridiv2(double ex,double ey) { double lx=cx,ly=cy,rx=dx,ry=dy; while(dis(lx,ly,rx,ry)>=eps) { double tmpx=(rx-lx)/3,tmpy=(ry-ly)/3; double lmidx=lx+tmpx,lmidy=ly+tmpy; double rmidx=rx-tmpx,rmidy=ry-tmpy; double lans=dis(ex,ey,lmidx,lmidy)/r+dis(dx,dy,lmidx,lmidy)/q; double rans=dis(ex,ey,rmidx,rmidy)/r+dis(dx,dy,rmidx,rmidy)/q; if(rans-lans>eps) rx=rmidx,ry=rmidy; else lx=lmidx,ly=lmidy; } return dis(ex,ey,lx,ly)/r+dis(dx,dy,lx,ly)/q;; } double tridiv1() { double lx=ax,ly=ay,rx=bx,ry=by; while(dis(lx,ly,rx,ry)>=eps) { double tmpx=(rx-lx)/3,tmpy=(ry-ly)/3; double lmidx=lx+tmpx,lmidy=ly+tmpy; double rmidx=rx-tmpx,rmidy=ry-tmpy; double lans=tridiv2(lmidx,lmidy)+dis(ax,ay,lmidx,lmidy)/p; double rans=tridiv2(rmidx,rmidy)+dis(ax,ay,rmidx,rmidy)/p; if(rans-lans>eps) rx=rmidx,ry=rmidy; else lx=lmidx,ly=lmidy; } return tridiv2(lx,ly)+dis(ax,ay,lx,ly)/p; } void work() { 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",tridiv1()); } } int main() { zzc::work(); return 0; }