bzoj 1857: [Scoi2010]传送带
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,R
Output
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
Sample Input
0 0 0 100
100 0 100 100
2 2 1
100 0 100 100
2 2 1
Sample Output
136.60
HINT
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
解:三分套三分;
#include<cstdio> #include<cstring> #include<cmath> using namespace std; const double eps=1e-3; double as(double a){if(a>=0) return a;return -a;} int xa,ya,xb,yb,xc,yc,xd,yd,p,q,r; inline double dis(double x1,double y1,double x2,double y2) { return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); } inline double get(double x,double y) { double lx=xc,ly=yc,rx=xd,ry=yd; double x1,x2,y1,y2,t1,t2; while(as(lx-rx)>eps||as(ly-ry)>eps) { x1=lx+(rx-lx)/3, y1=ly+(ry-ly)/3; x2=lx+(rx-lx)/3*2,y2=ly+(ry-ly)/3*2; t1=dis(xa,ya,x,y)/p+dis(x,y,x1,y1)/r+dis(x1,y1,xd,yd)/q; t2=dis(xa,ya,x,y)/p+dis(x,y,x2,y2)/r+dis(x2,y2,xd,yd)/q; if(t1>t2) lx=x1,ly=y1; else rx=x2,ry=y2; } return dis(xa,ya,x,y)/p+dis(x,y,lx,ly)/r+dis(lx,ly,xd,yd)/q; } int main() { scanf("%d %d %d %d %d %d %d %d %d %d %d",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd,&p,&q,&r); double lx=xa,ly=ya,rx=xb,ry=yb; double x1,x2,y1,y2,t1,t2; while(as(lx-rx)>eps||as(ly-ry)>eps) { x1=lx+(rx-lx)/3,y1=ly+(ry-ly)/3; x2=lx+(rx-lx)/3*2,y2=ly+(ry-ly)/3*2; t1=get(x1,y1),t2=get(x2,y2); if(t1>t2) lx=x1,ly=y1; else rx=x2,ry=y2; } printf("%.2lf",get(lx,ly)); return 0; }
=-=======================