HDU3400 Line belt (几何+三分)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3400

题意:

给定两条平行的路的左右端点的坐标。然后给定三个速度求表示在分别在两条路上的速度和不在路上走的速度

求从点A走到点D的最短时间。

分析:

先假定一个点固定的话 那么中间肯定有一个点可以使时间最小 然后是一个下凸型函数,

我们可以用三分来求。但是本题的两个点都不固定,那么思考一下 我们就可以尝试用

两个三分来做,一个三分求一条路上的点,另一个求另外一条路上的点。

注意求距离开方的时候会有精度损失。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const double eps = 1e-7;
const double ee = 1e-9;

double p,q,r;

struct point{
    double x,y;
};

point a,b,c,d,tmp1,tmp2;

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

double calu(double t)
{
    tmp2.x=d.x+(c.x-d.x)/dis(c,d)*t*q;
    tmp2.y=d.y+(c.y-d.y)/dis(c,d)*t*q;
    return t + dis(tmp1,tmp2)/r;
}
double sanfen(double t)
{
    tmp1.x=a.x+(b.x-a.x)/dis(a,b)*t*p;
    tmp1.y=a.y+(b.y-a.y)/dis(a,b)*t*p;
    double low=0,high=dis(c,d)/p,ll,rr;
    while(high-low>eps){
        ll=(low*2+high)/3;
        rr=(low+high*2)/3;
        if(calu(ll)<calu(rr)) high=rr;
        else low=ll;
    }
    return t+calu(ll);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        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,&r);
        double low = 0, high = dis(a,b)/p,ll,rr;
        while(high-low>eps){
            ll=(low*2+high)/3;
            rr=(low+high*2)/3;
            if(sanfen(ll)<sanfen(rr)) high=rr;
            else low = ll;
        }
        printf("%.2lf\n",sanfen(ll));
    }
    return 0;
}
时间: 2024-10-07 02:21:51

HDU3400 Line belt (几何+三分)的相关文章

HDU 3400 Line belt (三分再三分)

HDU 3400 Line belt (三分再三分) ACM 题目地址: HDU 3400 Line belt 题意: 就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑,在其他地方跑速度是r.问你从A到D最少的时间. 分析: 先三分AB上的点,再三分CD上的点即可. 证明: 设E在AB上,F在CD上. 令人在线段AB上花的时间为:f = AE / p,人走完Z和Y所花的时间为:g = EF / r + FD / q. f函数是一个单调递增的函数,而g很明显是一个先递减后递

HDU 3400 Line belt (三分嵌套)

题目链接 Line belt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2862    Accepted Submission(s): 1099 Problem Description In a two-dimensional plane there are two line belts, there are two segment

Line belt(三分镶嵌)

In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the speed R on other area on the plane. How long must he take to travel from A to D? Input The first lin

HDU 3400 Line belt 三分

笨蛋的难题(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述        笨蛋之所以称为笨蛋,是因为他有点路痴.他一旦不高兴,就必然一个人漫无目的的出去走走.今天下雨了,他又不高兴了,怎么办?那就出去走呗,这不又丢了,这次幸好记下出来时的方向,并且在一张纸上密密麻麻的记下了他拐的弯(他很聪明吧,拐的弯都是90度的弯),0代表左拐,1代表右拐,那么多0.1,他实在看不下去了,正好遇见善良加聪明的你,你能告诉他,他现在面向哪吗? 输入 多组测试数据 第一行 输入:

三分套三分 --- HDU 3400 Line belt

Line belt Problem's Link:    Mean: 给出两条平行的线段AB, CD,然后一个人在线段AB的A点出发,走向D点,其中,人在线段AB上的速度为P, 在线段CD上的速度为Q,在其他地方的速度为R,求人从A点到D点的最短时间. analyse: 经典的三分套三分. 首先在AB线段上三分,确定一个点,然后再在CD上三分,确定第二个点,计算出answer.也就是嵌套的三分搜索. Time complexity: O(logn*logm) Source code:  // M

搜索(三分):HDU 3400 Line belt

Line belt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3531    Accepted Submission(s): 1364 Problem Description In a two-dimensional plane there are two line belts, there are two segments AB

poj 3301 Texas Trip(几何+三分)

Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in the door of his SUV. The local American Tire store sells fiberglass patching material only in square sheets. What is the smallest patch that Harry nee

hdu Line belt

这道题是一道3分搜索的题.其实这种题很多时候都出现在高中的解析几何上,思路很简单,从图中可以看到,肯定在AB线段和CD线段上各存在一点x和y使得所花时间最少 因为AB和CD上的时间与x和y点的坐标都存在一个凸函数的关系,所以可以想到利用3分搜索的方式进行求解.当然这里要用到两个三分搜索的嵌套,锁定x后找到满足条件的y,知道最小的满足条件的x和y.用三分搜索的好处就是 可以利用两点的中点坐标公式,这样比用存数学公式求解要方便的多. #include"iostream" #include&

hdu 3400 Line belt

题意:给你两条线段AB,CD:然后给你在AB,CD上的速度P,Q,在其它部分的速度是R,然后求A到D的最短时间. 思路:用三分枚举从AB线段上离开的点,然后再用三分枚举在CD的上的点找到最优点,求距离和时间就可以. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 const double ep