三分套三分
电影课上写的orz
gyz大佬直接秒出正解orz
我只负责敲敲qwq
先三分第一条直线上走的长度,在三分第二条直线上的长度
/**************************************************************
Problem: 1857
User: syh0313
Language: C++
Result: Accepted
Time:52 ms
Memory:1288 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using
namespace
std;
const
double
eps=1e-8;
double
ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
double
calc(
double
x,
double
y)
{
double
aa=x/p; aa+=y/q;
double
xxa,yya,xxb,yyb;
if
(
sqrt
((ax-bx)*(ax-bx)+(ay-by)*(ay-by))<eps)
{xxa=ax; yya=ay;}
else
{
xxa=ax+x*(bx-ax)/
sqrt
((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
yya=ay-x*(ay-by)/
sqrt
((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}
if
(
sqrt
((cx-dx)*(cx-dx)+(cy-dy)*(cy-dy))<eps)
{xxb=dx; yyb=dy;}
else
{
xxb=dx-y*(dx-cx)/
sqrt
((cx-dx)*(cx-dx)+(cy-dy)*(cy-dy));
yyb=dy-y*(dy-cy)/
sqrt
((cx-dx)*(cx-dx)+(cy-dy)*(cy-dy));
}
aa+=
sqrt
((xxa-xxb)*(xxa-xxb)+(yya-yyb)*(yya-yyb))/r;
return
aa;
}
double
work(
double
x)
{
double
l=0,r=
sqrt
((cx-dx)*(cx-dx)+(cy-dy)*(cy-dy));
while
(eps<r-l)
{
double
lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
double
ti1=calc(x,lmid),ti2=calc(x,rmid);
if
(ti1-ti2>eps) l=lmid;
else
r=rmid;
}
return
calc(x,l);
}
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);
double
l=0,r=
sqrt
((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
while
(eps<r-l)
{
double
lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
double
ti1=work(lmid),ti2=work(rmid);
if
(ti1-ti2>eps) l=lmid;
else
r=rmid;
}
printf
(
"%.2lf\n"
,work(l));
return
0;
}