bzoj1857: [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
三分再AB、CD上走的路径长度
结果还是被卡精度啦……gg
觉得不能浪费太多时间(本地测6000+组数据都是对的……
颓……
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cmath> #include<cstdio> #include<algorithm> using namespace std; int read_p,read_ca,read_f; inline int read(){ read_p=0;read_ca=getchar();read_f=1; while(read_ca<'0'||read_ca>'9') {if (read_ca=='-') read_f=-1;read_ca=getchar();} while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p*read_f; } int xa,ya,xb,yb,xc,yc,xd,yd,p,q,r; long double z1,z2; inline double g(double a,double b){ double xx1,yy1,xx2,yy2,zz1,zz2; zz1=a/z1;zz2=b/z2; xx1=xa+(xb-xa)*zz1; yy1=ya+(yb-ya)*zz1; xx2=xd+(xc-xd)*zz2; yy2=yd+(yc-yd)*zz2; return a/p+b/q+sqrt((xx2-xx1)*(xx2-xx1)+(yy2-yy1)*(yy2-yy1))/r; } inline double f(double x){ double l=0,r=z2,mid1,mid2,w; while (r-l>=1e-10){ w=(r-l)/3.0;mid1=l+w;mid2=mid1+w; if (g(x,mid1)>g(x,mid2)) l=mid1;else r=mid2; } return g(x,l); } int main(){ /*freopen("a.in","r",stdin); freopen("a.out","w",stdout);*/ xa=read();ya=read();xb=read();yb=read();xc=read();yc=read();xd=read();yd=read(); z1=sqrt((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya));z2=sqrt((xd-xc)*(xd-xc)+(yd-yc)*(yd-yc)); p=read();q=read();r=read(); double l=0,r=z1,mid1,mid2,w; while (r-l>1e-10){ w=(r-l)/3.0;mid1=l+w;mid2=mid1+w; if (f(mid1)>f(mid2)) l=mid1;else r=mid2; } printf("%.2lf\n",f(l)); }