三分是挺显然的,但是这题不是一个三分就能解决的,而需要两个三分。一个一条传送带,两条传送带需要两个三分。
三分在第一条传送带行走的路程,然后通过这个枚举的mid来求出在第一题传送带行走mid距离后的位置;三分在第二条传送带行走的路程,然后通过这个枚举的mid2来求出在第二条传送带行走mid2后的位置;最后加上两个位置之间的时间即可。
这样枚举的话算位置挺麻烦的,要推一波麻烦的三角公式,并且再算斜率的时候还要判断一下两个x坐标是否相同,不然可能会出现除以0的情况。
有题解是三分x坐标和y坐标的位置,就十分方便了。
#include <bits/stdc++.h>
#define eps 1e-10
using namespace std;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r,dis1,dis2;
inline double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
inline double jay(double mid,double x,double y)
{
double nowx,nowy,posx,posy;
if (fabs(dx-cx)>eps)
{
nowx=sqrt(mid*mid/(1+((dy-cy)/(dx-cx))*((dy-cy)/(dx-cx))));
nowy=fabs((dy-cy)/(dx-cx)*nowx);
}
else
{
nowx=0;
nowy=mid;
}
if (dx>cx) posx=dx-nowx; else posx=dx+nowx;
if (dy>cy) posy=dy-nowy; else posy=dy+nowy;
double ans;
ans=dis(x,y,posx,posy)/r+dis(posx,posy,dx,dy)/q;
return ans;
}
inline double check(double mid)
{
double nowx,nowy,posx,posy;
if (fabs(bx-ax)>eps)
{
nowx=sqrt(mid*mid/(1+((by-ay)/(bx-ax))*((by-ay)/(bx-ax))));
nowy=fabs((by-ay)/(bx-ax)*nowx);
}
else
{
nowx=0;
nowy=mid;
}
if (ax>bx) posx=ax-nowx; else posx=ax+nowx;
if (ay>by) posy=ay-nowy; else posy=ay+nowy;
double l,r,lmid,rmid;
l=0; r=dis2;
while (r-l>=eps)
{
lmid=l+(r-l)/3; rmid=r-(r-l)/3;
if (jay(lmid,posx,posy)<=jay(rmid,posx,posy)) r=rmid;
else l=lmid;
}
double ans;
ans=mid/p+jay(l,posx,posy);
return ans;
}
int main(){
scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy);
scanf("%lf%lf%lf",&p,&q,&r);
dis1=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
dis2=sqrt((cx-dx)*(cx-dx)+(cy-dy)*(cy-dy));
double l,r,lmid,rmid;
l=0; r=dis1;
while (r-l>=eps)
{
lmid=l+(r-l)/3; rmid=r-(r-l)/3;
if (check(lmid)<=check(rmid)) r=rmid;
else l=lmid;
}
double ans;
ans=check(l);
printf("%.2f\n",ans);
return 0;
}