1. 程式人生 > >P2571 [SCOI2010]傳送帶

P2571 [SCOI2010]傳送帶

圖片 坐標 \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>
using
namespace 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); }
View Code

P2571 [SCOI2010]傳送帶