2010-1151

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

题目大意:
Forestkeeper 在218喜欢乱丢纸团,现在给一个二维平面,Forestkeeper 从原点丢出一个纸团,目标是垃圾桶, 垃圾桶和原点之间有些矩形阻碍物,然后还有不能碰到天花板,碰到最后的墙会反弹,求问Forestkeeper能否将纸团丢进垃圾桶。
由于障碍物的存在,纸团丢的显然是越高越好,于是可以求出与X相交且贴近天花板的抛物线方程,然后检查是否会碰到障碍物即可。
对于墙的反弹,只需要把垃圾桶的地方做一次镜面变换就好了
程序:
{{{
#!cpp
#include<cstdio>
#include <cstring>
int n;
double h;
double tar,wall;
double data[1000][2];
double x0;
double f(double x)
{
    return -4*h/x0/x0*x*(x-x0);
}
int main()
{
    while (scanf("%d%lf",&n,&h)!=EOF)
    {
        data[0][0]=0;
        for (int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&data[i][0],&data[i][1]);
            data[i][0]=data[i-1][0]+data[i][0];
        }
        data[n+1][1]=0;
        scanf("%lf%lf",&tar,&wall);
        if (data[1][0]<=0.000000001)
        {
            printf("No\n");
            continue;
        }
        bool res=false;
        bool can=true;
        x0=tar;
        for (int i=1;i<=n;i++)
        {
            if (f(data[i][0])<data[i][1]-0.0000001||f(data[i][0])<data[i+1][1]-0.0000001 )
                can=false;
        }
        if (can)
            res=true;
        x0=2*wall-tar;
        can=true;
        for (int i=1;i<=n;i++)
        {
            if (f(data[i][0])<data[i][1]-0.0000001||f(data[i][0])<data[i+1][1]-0.0000001 )
                can=false;
        }
        if (can)
            res=true;
        if (res)    
            printf("Yes\n");
        else
            printf("No\n");
    }


}





}}}

题目大意:

Forestkeeper 在218喜欢乱丢纸团,现在给一个二维平面,Forestkeeper 从原点丢出一个纸团,目标是垃圾桶, 垃圾桶和原点之间有些矩形阻碍物,然后还有不能碰到天花板,碰到最后的墙会反弹,求问Forestkeeper能否将纸团丢进垃圾桶。

由于障碍物的存在,纸团丢的显然是越高越好,于是可以求出与X相交且贴近天花板的抛物线方程,然后检查是否会碰到障碍物即可。

对于墙的反弹,只需要把垃圾桶的地方做一次镜面变换就好了

程序:

#include<cstdio>
#include <cstring>
int n;
double h;
double tar,wall;
double data[1000][2];
double x0;
double f(double x)
{
    return -4*h/x0/x0*x*(x-x0);
}
int main()
{
    while (scanf("%d%lf",&n,&h)!=EOF)
    {
        data[0][0]=0;
        for (int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&data[i][0],&data[i][1]);
            data[i][0]=data[i-1][0]+data[i][0];
        }
        data[n+1][1]=0;
        scanf("%lf%lf",&tar,&wall);
        if (data[1][0]<=0.000000001)
        {
            printf("No\n");
            continue;
        }
        bool res=false;
        bool can=true;
        x0=tar;
        for (int i=1;i<=n;i++)
        {
            if (f(data[i][0])<data[i][1]-0.0000001||f(data[i][0])<data[i+1][1]-0.0000001 )
                can=false;
        }
        if (can)
            res=true;
        x0=2*wall-tar;
        can=true;
        for (int i=1;i<=n;i++)
        {
            if (f(data[i][0])<data[i][1]-0.0000001||f(data[i][0])<data[i+1][1]-0.0000001 )
                can=false;
        }
        if (can)
            res=true;
        if (res)    
            printf("Yes\n");
        else
            printf("No\n");
    }
}