zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }

     

     

  • 相关阅读:
    发一注册表监控驱动代码
    Nikto
    在c#使用IOCP(完成端口)的简单示例
    C#中ref和out的使用小结
    Powerful x86/x64 Mini HookEngine
    C语言写的多线程下载器
    快速排序算法c#
    拓扑排序
    Dijkstra算法
    SRM 550 DIV2
  • 原文地址:https://www.cnblogs.com/BobHuang/p/7735045.html
Copyright © 2011-2022 走看看