蒟蒻的求助
  • 板块学术版
  • 楼主allenchoi
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/1/25 21:43
  • 上次更新2023/10/28 10:57:08
查看原帖
蒟蒻的求助
298037
allenchoi楼主2022/1/25 21:43

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;
}
2022/1/25 21:43
加载中...