hdu 3400 Line belt

本文介绍了一个三维场景下寻找从线段AB到线段CD的最短时间路径的问题,并通过两次三分查找实现。首先在线段AB上找到合适的点M,接着在CD上找到点N,使得总时间最小。代码使用C++编写,包括距离计算、查找中间点等关键函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题,设AB上走到M处,CD上走到N处,然后得到AM===MN====ND的时间,先三分M,再三分D,至于为什么。。。

感受一下情况1假设AB走的M越远,到N就越短,然后就满足三分条件

2.AB走的越近到N越短的话,直接三分到A,就是不走AB。

最后CD上同理,于是就是三分套三分。

pqr的速度都不用考虑的,反正三分能求出最值。

#include<cstdio>
#include<cstring>
#include<cmath> 
#define eps 1e-7

using namespace std;
//http://www.cnblogs.com/newpanderking/archive/2011/08/27/2155430.html
struct point
{
	double x,y;
};
double p,q,v;

double dis(point a,point b)
{
	return sqrt(pow((a.y-b.y),2)+pow(a.x-b.x,2));
}

double findy(point c,point d,point y)
{
    point mid,midmid,left,right;
    double t1,t2;
    left = c;
    right = d;
    do
    {
        mid.x = (left.x+right.x)/2;
        mid.y = (left.y+right.y)/2;
        midmid.x = (right.x+mid.x)/2;
        midmid.y = (right.y+mid.y)/2;
        t1 = dis(d,mid)/q+dis(mid,y)/v;
        t2 = dis(d,midmid)/q+dis(midmid,y)/v;
        if(t1>t2)
        left = mid;
        else right = midmid;
    }while(fabs(t1-t2)>0.000001);
    return t1;
}
double find(point a,point b,point c,point d)
{
    point mid,midmid,left,right;
    double t1,t2;
    left = a;
    right = b;
    do
    {
        mid.x = (left.x+right.x)/2;
        mid.y = (left.y+right.y)/2;
        midmid.x = (right.x+mid.x)/2;
        midmid.y = (right.y+mid.y)/2;
        t1 = dis(a,mid)/p+findy(c,d,mid);
        t2 = dis(a,midmid)/p+findy(c,d,midmid);
        if(t1>t2)left = mid;
        else right = midmid;
    }while(fabs(t1-t2)>0.000001);
    return t1;
}
int main()
{
	int t;
	point a,b,c,d;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
		scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
		scanf("%lf%lf%lf",&p,&q,&v);
		printf("%.2f\n",find(a,b,c,d));
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值