三分法

来源:互联网 发布:centos和debian 编辑:程序博客网 时间:2024/06/12 01:20

通往女友之路
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;
}

 

 

原创粉丝点击