通往女友之路
http://www.bianchengla.com/oj/bcpc/practise/problem?id=1768
通往女友之路
时间限制:1000 ms | 内存限制:65536 KB
描述
据传言,最近 lzx 暗地里交了一个新的女朋友。某天女朋友一声令下,要 lzx 立即和她共进晚餐,于是 lzx 不得不立即向女朋友的住处赶去。
lzx 可以直接跑到女友家,也可以先跑到公路上招一辆出租车(我们假设空载的出租车只在公路上跑),然后让出租车直线送到女友的住处(载了客就不用考虑公路的问题了,lzx 当然会花大价钱尽可能快赶到)。
现已知 lzx 的和他女友住处的位置,以及 lzx 跑步的速度和出租车的速度。问 lzx 最少需要多长时间可以到女友的家。
为了简化问题,我们假设只有一条公路,在 x 轴上,且两端都无限延伸。
输入
输入包含多组数据。
第一行是一个整数 T,表示有 T 组测试数据(0 < T <= 2000)。
接下来 T 行每行一组数据,每行有 6 个整数,x1、y1、x2、y2、vr、vt。其中 (x1,y1)、(x2,y2) 分别为 lzx 和女友的坐标(-1000 <= x1,y1,x2,y2 <= 1000),vr 为 lzx 跑步的速度,vt 表示出租车的速度(1 <= vr < vt <= 1000)。我们认为 lzx 的体力和他携带的现金都是足够的,并且公路上随时都能招到出租车。
输出
对于每组数据,输出一行,就一个实数,为 lzx 到达女友住处的最短时间(保留两位小数)。
样例输入
2
1 1 2 2 1 2
1 1 2 2 1 7
样例输出
1.41
1.32
来源
第五届北航程序设计大赛 - 决赛
当需要求某凸性或凹形函数的极值,通过函数本身表达式并不容易求解时,就可以用三分法不断逼近求解
类似二分的定义Left和Right
mid = (Left + Right) / 2
midmid = (mid + Right) / 2;
如果mid靠近极值点,则Right = midmid;
否则(即midmid靠近极值点),则Left = mid;
参考代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int vr,vt,x1,y_1,x2,y2;;
double consumer(double a)
{
double t1=sqrt((double )((a-x1)*(a-x1)+(y_1*y_1)))/vr;
t1+=sqrt((double)((x2-a)*(x2-a)+(y2*y2)))/vt;
return t1;
}
int main()
{
int t;
double midx,midmidx,left,right ,eps=1e-10,time,t1;
cin>>t;
while(t--)
{
scanf("%d%d%d%d%d%d",&x1,&y_1,&x2,&y2,&vr,&vt);
if(x1<x2)
{
left=x1;
right=x2;
}
else
{
left=x2;
right=x1;
}
time=sqrt((double)((x1-x2)*(x1-x2)+(y_1-y2)*(y_1-y2)))/vr;
while(left+eps<right)
{
midx=(left+right)/2.0;
midmidx=(midx+right)/2.0;
if(consumer(midx)>consumer(midmidx))
{
left=midx;
}
else
{
right=midmidx;
}
}
t1=consumer(left);
if(time<t1)
{
printf("%.2lf\n",time);
}
else
printf("%.2lf\n",t1);
}
return 0;
}