TOJ 2353: Billiard

数学?计算几何?物理?这个还是很轻松的。

353: Billiard 分享至QQ空间

Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte
Total Submit: 9            Accepted:4

Description

 

In a billiard table with horizontal side a inches and vertical side b inches, a ball is launched from the middle of the table. After s > 0 seconds the ball returns to the point from which it was launched, after having made m bounces off the vertical sides and n bounces off the horizontal sides of the table. Find the launching angle A (measured from the horizontal), which will be between 0 and 90 degrees inclusive, and the initial velocity of the ball.

Assume that the collisions with a side are elastic (no energy loss), and thus the velocity component of the ball parallel to each side remains unchanged. Also, assume the ball has a radius of zero. Remember that, unlike pool tables, billiard tables have no pockets.

 

Input

Input consists of a sequence of lines, each containing five nonnegative integers separated by whitespace. The five numbers are: absm, and n, respectively. All numbers are positive integers not greater than 10000.

Input is terminated by a line containing five zeroes.

 

Output

For each input line except the last, output a line containing two real numbers (accurate to two decimal places) separated by a single space. The first number is the measure of the angle A in degrees and the second is the velocity of the ball measured in inches per second, according to the description above.

Sample Input

100 100 1 1 1
200 100 5 3 4
201 132 48 1900 156
0 0 0 0 0

Sample Output

45.00 141.42
33.69 144.22
3.09 7967.81

Source

Waterloo June.19 1999

horizontal这个单词我还迷了一会,原来就是给你一个长a宽b的台球桌,桌子正中心有一个球,和水平方向以某个夹角,某个速度打出,在s秒后回到原来位置并且和水平方向撞了m次,垂直方向撞了n次

问那你这个夹角和速度

所以转化为物理(数学)问题

你可以把他的路径拼成一条直线,这样明显就知道直角三角形的两条边了

求速度呢,这个也简单,你算一下走过的距离好了,水平方向走了多少,竖直方向走了多少,距离就是斜边长度啊,还有时间s,所以这个题就是个简单数学问题了

 

#include<stdio.h>
#include<math.h>
const double PI=acos(-1.);
int main()
{
    double a,b,s,m,n;
    while(~scanf("%lf%lf%lf%lf%lf",&a,&b,&s,&m,&n),a||b||s||m||n)
        printf("%.2f %.2f\n",atan(b*n/a/m)*180/PI,sqrt(b*b*n*n+a*a*m*m)/s);
    return 0;
}

 

另附上一道天梯赛和这个一样好玩的

L3-1. 非常弹的球 
刚上高一的森森为了学好物理,买了一个“非常弹”的球。虽然说是非常弹的球,其实也就是一般的弹力球而已。森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不太会,你能帮他解决吗?当然为了刚学习物理的森森,我们对环境做一些简化: 
•假设森森是一个质点,以森森为原点设立坐标轴,则森森位于(0, 0)点。 
•小球质量为w/100 千克(kg),重力加速度为9.8米/秒平方(m/s2)。 
•森森在地上用力弹球的过程可简化为球从(0, 0)点以某个森森选择的角度ang (0 < ang < pi/2) 向第一象限抛出,抛出时假设动能为1000 焦耳(J)。 
•小球在空中仅受重力作用,球纵坐标为0时可视作落地,落地时损失p%动能并反弹。 
•地面可视为刚体,忽略小球形状、空气阻力及摩擦阻力等。

森森为你准备的公式:

动能公式:E = m * v^2 / 2 
牛顿力学公式:F = m * a 
重力:G = m * g 
其中: 
E - 动能,单位为“焦耳” 
m - 质量,单位为“千克” 
v - 速度,单位为“米/秒” 
a - 加速度,单位为“米/秒平方” 
g - 重力加速度

输入格式:

输入在一行中给出两个整数:1 <= w <= 1000 和 1 <= p <= 100,分别表示放大100倍的小球质量、以及损失动力的百分比p。

输出格式:

在一行输出最远的投掷距离,保留3位小数。 
输入样例:100 90

输出样例:226.757 
简单推一下,v^2=2E/m 
s=vt=2vcosθ/g*vsinθ=v^2sin2θ/g 
sin2θ最大值是1,也就是θ为45°

#include<stdio.h>
#include<cmath>
int main()
{
    double w,p,e;
    scanf("%lf%lf",&w,&p);
    e=2000*100/w;
    p=1-p/100;
    double s=0;
    while(e>0.000001)
    {
        s+=e/9.8;
        e=e*p;
    }
    printf("%.3f",s);
    return 0;
}

 

 

 

posted @ 2017-10-26 08:01  暴力都不会的蒟蒻  阅读(299)  评论(0编辑  收藏  举报