萌新三分求抓虫
查看原帖
萌新三分求抓虫
87434
_Life_楼主2021/1/20 08:22

萌新的三分爆炸力

代码思路清晰 关键处均有注释 马蜂不毒瘤 (确信)

谔谔

#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));
}
2021/1/20 08:22
加载中...