为啥这份代码WA80(WA掉的两个点显示负数)
查看原帖
为啥这份代码WA80(WA掉的两个点显示负数)
298037
allenchoi楼主2022/1/25 20:56
#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,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,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);
	
	printf("%.2lf\n",sf());
	
	return 0;
}

求助

2022/1/25 20:56
加载中...