SGU 204 Little Jumper(三分)

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=204

题意:给出下图中的参数。从A跳到B。在A起跳速度为v1,在中间起跳速度为v2。求min(max(v1,v2))。

思路:在两个木板之间的位置是单峰函数,三分。




const double EPS=1e-12;
double b1,t1,b2,t2,L,ds,df,g;


double cal(double x1,double y1,double x2)
{
    double a=y1/(x1*x1-x1*x2);
    return -g*a*x2*x2/2-g/(2*a);
}

double cal(double b1,double t1,double L1,double L2)
{
    double ans=min(cal(L1,b1,L1+L2),cal(L1,t1,L1+L2));
    double p=L1+L2,temp=g*p,y=L1*L2/p;
    if(y>=b1&&y<=t1) ans=temp;
    return ans;
}

double cal(double x)
{
    return max(cal(b1,t1,ds,x),cal(b2,t2,L-x,df));
}

int main()
{
    while(cin>>b1>>t1>>b2>>t2>>L>>ds>>df>>g)
    {
        double low=EPS,high=L,mid1,mid2,x,y;
        while(high-low>1e-12)
        {
            mid1=(low+high)*0.5;
            mid2=(mid1+high)*0.5;
            x=cal(mid1);
            y=cal(mid2);
            if(x<y) high=mid2;
            else low=mid1;
        }
        double ans=min(cal((low+high)*0.5),min(cal(low),cal(high)));
        printf("%.4lf\n",sqrt(ans));
    }
    return 0;
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值