20/7每日一题acm

原型是一个3D游戏,允许你控制一个叫亚历克斯的人,具有超强的能力来完成任务。亚历克斯有能力在空中滑翔。更重要的是,他最多可以做3级滑翔,这意味着在着陆之前,他有两次机会调整并进行另一次滑翔。我们假设每次他滑行时,他的垂直速度变为零,以一种新的速度向前滑行。由于重力,轨道将是抛物线。

为了使问题更容易,我们现在只考虑最多2级滑翔。第一次滑移的数学方程的二项式系数为-a,第二个为-b,这意味着配方是(y-y0)=-ax^{2}(y - y0) = -b(x - x0)^{2}。如上图所示,亚历克斯从建筑顶上滑行,形成1级或2级滑行,正好在点B着陆。更重要的是,在建筑物1和建筑物B之间有两座建筑物. 亚历克斯必须避免撞到上面。

Input

不超过15例。进行到文件的末尾。

每个实例只包含六个实数h1 h2 d1 d2 abh1的一行,h1是建筑1的高度,h2是建筑2的高度,d1是建筑1和建筑2之间的X距离,d2是点B和建筑1之间的X距离。这四个数在[0, 1000 ]中,满足d1<d2。a和b在(0, 1000)中。

Output

如果亚历克斯正好落在B点上,则打印“是”,否则打印“不”。

Sample Input

25 1 6 7 1 1
4 3 1 2 1 1

Sample Output

Yes
Yes

HINT

在第2种情况下,亚历克斯只是滑过建筑物2,并没有撞到它上。

代码如下:

#include <cstdio>
#include <cmath>
const double eps=1e-9;
double h1,h2,d1,d2,a,b;
bool check(double x0){
    double y;
    if(x0<d1){
        double y0=h1-a*x0*x0;
        y=y0-b*(d1-x0)*(d1-x0);
    }
    else if(x0-eps>d2) return false;
    else y=h1-a*d1*d1;
    return y+eps>=h2;
}
int main(){
    while(scanf("%lf %lf %lf %lf %lf %lf",&h1,&h2,&d1,&d2,&a,&b)==6){
        double A=a+b;
        double B=-2.*b*d2;
        double C=b*d2*d2-h1;
        double det=B*B-4*A*C;
        bool ans=false;
        if(det+eps>=0){
            det=sqrt(fabs(det));
            double x1=(-B-det)/(2*A);
            double x2=(-B+det)/(2*A);
            if(x1+eps>=0.) ans=ans||check(x1);
            if(x2+eps>=0.) ans=ans||check(x2);
        }
        puts(ans?"Yes":"No");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u012178728/article/details/81139768