P2571 [SCOI2010]傳送帶
阿新 • • 發佈:2018-07-07
圖片 坐標 \n ans color esp include code 如果
鏈接:https://www.luogu.org/problemnew/show/P2571
題目描述
在一個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位
輸入輸出樣例
輸入樣例#1: 復制0 0 0 100 100 0 100 100 2 2 1輸出樣例#1: 復制
136.60
說明
對於100%的數據,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
題解:
三分套。
? 首先如果確定了 AB 上從哪個點離開,那麽 上從哪個點離開,那麽 上從哪個點離開,那麽 CD 上點的 上點的 距離函數一定是個單谷,可以三分來求。
? 如何求解 AB 上的點呢?
? 他也滿足單谷的性質,可以三分來求。用CD上的點來更新AB上的點
#include<bits/stdc++.h> usingView Codenamespace std; const double eps = 1e-6; double Ax, Ay, Bx, By, Cx, Cy, Dx, Dy, p, q, r; double dis(double x1, double y1, double x2, double y2){ return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } double work(double nx, double ny){ double lf = Cx, rg = Dx, hlf = Cy, hrg = Dy, ans = 1000000008; while(1){ double midx = (lf + rg) / 2, midy = (hlf + hrg) / 2; double midxm = (midx + rg) / 2, midym = (midy + hrg) / 2; double tmp1 = dis(nx, ny, midx, midy)/r + dis(Ax, Ay, nx, ny)/ p + dis(midx, midy, Dx, Dy)/q; double tmp2 = dis(nx, ny, midxm, midym)/r + dis(Ax, Ay, nx, ny)/ p + dis(midxm, midym, Dx, Dy)/q; if(tmp1 < tmp2) rg = midxm, hrg = midym; else lf = midx, hlf = midy; ans = min(ans, min(tmp1, tmp2)); // printf("%lf %lf\n", tmp1, tmp2); if(fabs(midx-midxm) < eps && fabs(midy-midym) < eps)break; } return ans; } int main(){ double ans = 100000000008; scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &Ax, &Ay, &Bx, &By, &Cx, &Cy, &Dx, &Dy, &p, &q, &r); double lf = Ax, rg = Bx, hlf = Ay, hrg = By; while(1){ double midx = (lf + rg) / 2, midy = (hlf + hrg) / 2; double midxm = (midx + rg) / 2, midym = (midy + hrg) / 2; double ans1 = work(midx, midy), ans2 = work(midxm, midym); if(ans1 < ans2) rg = midxm, hrg = midym; else lf = midx, hlf = midy; ans = min(ans, min(ans1, ans2)); if(fabs(midx-midxm) < eps && fabs(midy-midym) < eps)break; } printf("%.2lf\n", ans); }
P2571 [SCOI2010]傳送帶