hdoj 3400 三分
两次三分
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int x[5],y[5],v[5]; double cal(double x1,double x2,double y1,double y2) { double tmp=(x1-x2)*(x1-x2); tmp+=(y1-y2)*(y1-y2); return sqrt(tmp); } double chk(double xx,double yy) { double stx=x[3],sty=y[3],edx=x[4],edy=y[4]; double txt1,txt2; while(1) { txt1=cal(xx,x[1],yy,y[1])/v[1]+cal(stx+(edx-stx)/3,x[4],sty+(edy-sty)/3,y[4])/v[2]; txt1+=cal(xx,stx+(edx-stx)/3,yy,sty+(edy-sty)/3)/v[3]; txt2=cal(xx,x[1],yy,y[1])/v[1]+cal(stx+(edx-stx)/3*2,x[4],sty+(edy-sty)/3*2,y[4])/v[2]; txt2+=cal(xx,stx+(edx-stx)/3*2,yy,sty+(edy-sty)/3*2)/v[3]; if(txt1<txt2) { edx=stx+(edx-stx)/3*2; edy=sty+(edy-sty)/3*2; } else { stx=stx+(edx-stx)/3; sty=sty+(edy-sty)/3; } if(fabs(txt1-txt2)<0.0001) break; } return txt1; } int main() { int T; scanf("%d",&T); while(T--) { for(int i=1;i<=4;i++) scanf("%d %d",&x[i],&y[i]); for(int i=1;i<=3;i++) scanf("%d",&v[i]); double stx=x[1],sty=y[1],edx=x[2],edy=y[2]; double txt1,txt2; while(1) { txt1=chk(stx+(edx-stx)/3,sty+(edy-sty)/3); txt2=chk(stx+(edx-stx)/3*2,sty+(edy-sty)/3*2); if(txt1<txt2) { edx=stx+(edx-stx)/3*2; edy=sty+(edy-sty)/3*2; } else { stx=stx+(edx-stx)/3; sty=sty+(edy-sty)/3; } if(fabs(txt1-txt2)<0.0001) break; } printf("%.2f\n",(txt1+txt2)/2); } return 0; }