zoj 2340 Little Jumper(三分 物理好题)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1395
大意:青蛙能从一个点跳到第三个点,如图,需要跳两次。问整个过程的最大起跳速度。
这里写图片描述

分析:对于每一次跳跃,设置水平的运动距离总长度是L,到达ti,bi时已经运动的水平距离是S,那么由物体的竖直抛体运动可以得到相应的等式。

L=vxtvy=gt2t=Lvx=2vygvxvy=gL2v=v2x+v2y2vxvy=gL

即当 vx=vy 时,v最小。速度夹角成45度。
(1)这是理想情况:
h=vyt12gt2=vySvx12g(Svx)2=SS2lBhT

当非理想情况时,那么计算出来的h不在相应的区间内。想要成功的跳跃,只有将速度改变(大小,方向)。
(2) h>T:
设速度夹角delta:
这里写图片描述
想要不撞上墙,需要将速度夹角变小。尽量接近理想状态。
h=vyt12gt2=Tvyt=T+12gt2=T+12g(Svx)2vySvx=T+12gS2v2xvxvyS=Tv2x+12gS2gLS2=Tv2x+12gS2v2x=gS(LS)2Tv2y=1t2(T+12gS2v2x)2=v2xS2(T+12gS2v2x)2v=v2x+v2y

(3)当h < B时,我们相同过程推出:
v2x=gS(LS)2Bv2y=v2xS2(B+12gS2v2x)2v=v2x+v2y

solution:
上诉过程的基本假设是已知水平运动的距离,由此我们直接枚举那个距离,因为存在最小的速度,所以有技巧的枚举:三分。
注意此题需要人为的设定迭代次数,不然会超时。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double eps=1e-15;
double b1,t1,b2,t2,l,ds,df,g;
double calc(double L,double S,double T,double B){
     double h=S-S*S/L;
     if(h-T>eps){
        double xx=g*S*(L-S)/2/T;
        double yy=xx/S/S*(T+0.5*g*S*S/xx)*(T+0.5*g*S*S/xx);
        return sqrt(xx+yy);
     }
     if(h-B<-eps){
        double xx=g*S*(L-S)/2/B;
        double yy=xx/S/S*(B+0.5*g*S*S/xx)*(B+0.5*g*S*S/xx);
        return sqrt(xx+yy);
     }
     return sqrt(g*L);
}
double gv(double x){
     double v1=calc(x+ds,ds,t1,b1),v2=calc(l-x+df,df,t2,b2);  //L:总的长度 S:越点  T  B
     return v1-v2>eps?v1:v2;
}
int main()
{
    //freopen("cin.txt","r",stdin);
    while(~scanf("%lf%lf",&b1,&t1)){
        scanf("%lf %lf %lf %lf %lf %lf",&b2,&t2,&l,&ds,&df,&g);
        double lt=0,rt=l,mid1,mid2;
        double y1,y2;
        int c=0;
        while(rt-lt>eps && c++<100){
            mid1=lt+(rt-lt)/3;
            mid2=rt-(rt-lt)/3;
            y1=gv(mid1);  y2=gv(mid2);
            if(y1<y2) rt=mid2;
            else lt=mid1;
        }
        printf("%.6lf\n",gv(lt));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值