HDU 3400 两次三分

 

这道题卡了我好久,一直不能证明他们的距离为什么是先递减后递增,所以也不能想到三分

 

网上也没有给出证明,尝试用三分写了下,注意是三分的E,F点在AB CD点上的占的比例,这样代码比较简单好看

 

#include<stdio.h>
#include<math.h>
#include<string.h>
#define eps 1e-8
struct point
{
       double x,y;
};

point a,b,c,d;
double p,q,r;
double len(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double time(double l,double m)
{
     point e,f;
     e.x=l*(b.x-a.x)+a.x;
     e.y=l*(b.y-a.y)+a.y;
     f.x=m*(d.x-c.x)+c.x;
     f.y=m*(d.y-c.y)+c.y;
     return len(a,e)/p+len(e,f)/r+len(f,d)/q;
}
double ts(double ab)
{
     double ll=0.0,rr=1.0,mid,midmid;
     while(rr-ll>eps)
     {
        mid=(ll+rr)/2.0;
        midmid=(mid+rr)/2.0;
        if(time(ab,mid)<time(ab,midmid))
        rr=midmid;
        else
        ll=mid;
     }
     return time(ab,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 ll=0.0,rr=1.0;
       while(rr-ll>eps)
       {
           double mid=(rr+ll)/2.0;
           double midmid=(mid+rr)/2.0;
           if(ts(mid)<ts(midmid))
           rr=midmid;
           else
           ll=mid;
       }
       printf("%.2lf\n",ts(ll));
    }
    return 0;
}
       


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值