您的位置:首页 > 其它

HDU 3400 Line belt 嵌套三分搜索

2016-07-24 20:08 495 查看
Line belt

Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u

Submit

Status

Description

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 line is the case number T.

For each case, there are three lines.

The first line, four integers, the coordinates of A and B: Ax Ay Bx By.

The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.

The third line, three integers, P Q R.

0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000

1<=P,Q,R<=10

Output

The minimum time to travel from A to D, round to two decimals.

Sample Input

1

0 0 0 100

100 0 100 100

2 2 1

Sample Output

136.60

嵌套三分

//嵌套三分

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<math.h>
#include<sstream>
#include<set>
#include<map>
#include<iomanip>
#include<algorithm>
using namespace std;
const double MIN=0.00001;
struct point
{
double x,y;
};
double dis(point a,point b)
{
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
point a,b,c,d;
double p,q,r;
double solve_ab(point m)
{
point left=a,right=b;
point mid,midd;
double ans1=2,ans2=1;
while (fabs(ans1-ans2)>MIN)
{
mid.x=(left.x+right.x)/2;
mid.y=(left.y+right.y)/2;
midd.x=(mid.x+right.x)/2;
midd.y=(mid.y+right.y)/2;
ans1=dis(a,mid)/p+dis(mid,m)/r;
ans2=dis(a,midd)/p+dis(midd,m)/r;
if (ans1<ans2)
right=midd;
else
left=mid;
}
return ans1;

}
double solve_abcd()
{
point left=c,right=d;
point mid,midd;
double ans1=2,ans2=1;
while (fabs(ans1-ans2)>MIN)
{
mid.x=(left.x+right.x)/2;
mid.y=(left.y+right.y)/2;
midd.x=(mid.x+right.x)/2;
midd.y=(mid.y+right.y)/2;
ans1=dis(d,mid)/q+solve_ab(mid);
ans2=dis(d,midd)/q+solve_ab(midd);
if (ans1<ans2)
right=midd;
else
left=mid;
}
return ans1;
}
int main()
{
cout<<fixed<<setprecision(2);
int T;
cin>>T;
while (T--)
{
cin>>a.x>>a.y>>b.x>>b.y;
cin>>c.x>>c.y>>d.x>>d.y;
cin>>p>>q>>r;
cout<<solve_abcd()<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm