三分一个AB离开位置,三分一个CD进入位置
精度问题要开fabs
/**************************************************************
Problem: 1857
User: Clare
Language: C++
Result: Accepted
Time:20 ms
Memory:1272 kb
****************************************************************/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
#define INF 1010
#define eps 1e-3
double A[4][2],P,Q,R;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f*=-1,ch=getchar();
else ch=getchar();
}
while(ch<='9'&&ch>='0')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
double Dis(double x1,double y1,double x2,double y2)
{
double t1=x2-x1,t2=y2-y1;
return sqrt(t1*t1+t2*t2);
}
double Get(double x1,double y1,double x2,double y2)
{
return Dis(x1,y1,A[0][0],A[0][1])/P+Dis(x1,y1,x2,y2)/R+Dis(x2,y2,A[3][0],A[3][1])/Q;
}
double Cal(double x,double y)
{
double lx=A[2][0],ly=A[2][1],rx=A[3][0],ry=A[3][1],llx,lly,rrx,rry;
while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
{
llx=lx+(rx-lx)/3;rrx=rx-(rx-lx)/3;
lly=ly+(ry-ly)/3;rry=ry-(ry-ly)/3;
double Ans1=Get(x,y,llx,lly),Ans2=Get(x,y,rrx,rry);
if(Ans1>Ans2)
lx=llx,ly=lly;
else rx=rrx,ry=rry;
}
return Get(x,y,lx,ly);
}
int main()
{
double lx,ly,rx,ry,llx,lly,rrx,rry;
for(int i=0;i<4;i++)
{
A[i][0]=read();A[i][1]=read();
}
P=read();Q=read();R=read();
lx=A[0][0],ly=A[0][1],rx=A[1][0],ry=A[1][1];
while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
{
llx=lx+(rx-lx)/3;rrx=rx-(rx-lx)/3;
lly=ly+(ry-ly)/3;rry=ry-(ry-ly)/3;
double Ans1=Cal(llx,lly),Ans2=Cal(rrx,rry);
if(Ans1>Ans2)
lx=llx,ly=lly;
else rx=rrx,ry=rry;
}
printf("%.2lf\n",Cal(lx,ly));
return 0;
}