萌新的三分爆炸力
代码思路清晰 关键处均有注释 马蜂不毒瘤 (确信)
谔谔
#include<cmath>
#include<cstdio>
using namespace std;
double p,q,r;
struct point
{
double x,y;
void init()
{
scanf("%lf %lf",&x,&y);
}
}a,b,c,d;
inline double dis(const point &a,const point &b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double g(double t1,double t2)
{//运动所需总时间
point point1,point2;
point1.x=a.x+(b.x-a.x)*t1/(dis(a,b)/p);
point1.y=a.y+(b.y-a.y)*t1/(dis(a,b)/p);
point2.x=c.x+(d.x-c.x)*t2/(dis(c,d)/q);
point2.y=c.y+(d.y-c.y)*t2/(dis(c,d)/q);
return t1+t2+dis(point1,point2)/r;
}
double f(double t1)
{//三分t2(在CD上运动的时间)
double l=0,r=dis(c,d)/q,ml,mr;
while(r-l>1e-5)
{
ml=l+(r-l)/3;
mr=r-(r-l)/3;
if(g(t1,ml)<g(t1,mr))
r=mr;
else
l=ml;
}
return g(t1,l);
}
int main()
{
a.init();b.init();c.init();d.init();
scanf("%lf %lf %lf",&p,&q,&r);
double l=0,r=dis(a,b)/p,ml,mr;
while(r-l>1e-5)//三分t1(在AB上运动的时间)
{
ml=l+(r-l)/3;
mr=r-(r-l)/3;
if(f(ml)<f(mr))
r=mr;
else
l=ml;
}
printf("%.2lf",f(l));
}