P2571传送带总是80分,求助(WA的两个点输出负数)
代码:
#include <cstdio>
#include <cmath>
using namespace std;
double ax,ay,bx,by,cx,cy,dx,dy,a,b,c;
double tim(double lx,double ly,double x)
{
double t1 = sqrt((dx - cx) * (dx - cx) + (dy - cy) * (dy - cy)),t2 = x * b,h = (cx - dx) / t1 * t2,g = (cy - dy) / t1 * t2;
double sx = dx + h,sy = dy + g;
return sqrt((lx - sx) * (lx - sx) + (ly - sy) * (ly - sy)) / c + x;
}
double work(double x)
{
double t1 = sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)),t2 = x * a,h = (bx - ax) / t1 * t2,g = (by - ay) / t1 * t2;
double lx = ax + h,ly = ay + g,l = 0,r = sqrt((dx - cx) * (dx - cx) + (dy - cy) * (dy - cy)) / b + 1e-5,mid;
do
{
mid = (r - l) / 3;
if(tim(lx,ly,l + mid) < tim(lx,ly,r - mid)) r -= mid;
else l += mid;
} while(r - l > 1e-6);
return x + tim(lx,ly,l);
}
double sf()
{
double l = 0,r = sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)) / a + 1e-5,mid;
do
{
mid = (r - l) / 3;
if(work(l + mid) < work(r - mid)) r -= mid;
else l += mid;
} while(r - l > 1e-6);
return work(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",&a,&b,&c);
if(ax == bx && ay == by && cx == dx && cy == dy)
{
printf("%.2lf\n",sqrt((ax - cx) * (ax - cx) + (ay - cy) * (ay - cy)));
return 0;
}
printf("%.2lf\n",sf());
return 0;
}