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");
}
}