zoukankan      html  css  js  c++  java
  • UVa 10387- Billiard

    UVa 10387- Billiard

    Table of Contents

    1 题目

    =============

    Problem A: Billiard

    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:  a b s m , 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

    =============

    2 思路

    题目的关键在于两点。一是要明白反射的过程中角度的对称性,导致小球的轨迹中所有的线与水平方向的夹角都是一样的。 二是需要根据一这个性质,体会出a*m就是水平方向总路径长,b*n就是竖直方向总路径长,而小球总的路径长就是由总水平 长与总竖直长组成的三角形的斜边的长度。明白了这两点,代码就很容易写出来了。

    另外,说句题外话。这题目想了好几个小时才体会出来这两点。不断地画图,做小例子,才体会到。可能是我智商太低, 那么久才想出来,不过由自己亲自想出来一个结论,并且得到验证,那种感觉实在太美妙了!

    3 代码

    #include <stdio.h>
    #include <math.h>
    
    #define PI acos(-1)
    
    int main() {
      double a, b, s, m, n;
      double angle, velocity;
    
      while (scanf ("%lf%lf%lf%lf%lf", &a, &b, &s, &m, &n) != EOF) {
        if (a == 0 && b==0 && s==0 && m==0 && n==0) 
          break;
        angle = atan( (b*n)/(a*m) ) * 180 / PI;
        velocity = sqrt(b*n*b*n+a*m*a*m) / s;
        printf ("%.2lf %.2lf
    ", angle, velocity);
      }
    
      return 0;
    }


     
     
  • 相关阅读:
    SE -- IO
    SE -- 多线程
    SE -- 继承
    SE -- 面对对象
    SE -- 数组
    Modern Operating System --- Chap 5.5 Clocks
    Operating System: Three Easy Pieces --- Paging: TLB (Note)
    Operating System: Three Easy Pieces --- Process (Note)
    Some Interesting Websites and Blogs
    Implement a System Call in Kernel 3.10.56 (X86_64)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3249460.html
Copyright © 2011-2022 走看看