UVa 10387- Billiard

UVa 10387- Billiard

Table of Contents

1 題目

=============php

 

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.ide

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.post

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

=============spa

2 思路

題目的關鍵在於兩點。一是要明白反射的過程當中角度的對稱性,致使小球的軌跡中全部的線與水平方向的夾角都是同樣的。 二是須要根據一這個性質,體會出a*m就是水平方向總路徑長,b*n就是豎直方向總路徑長,而小球總的路徑長就是由總水平 長與總豎直長組成的三角形的斜邊的長度。明白了這兩點,代碼就很容易寫出來了。code

另外,說句題外話。這題目想了好幾個小時才體會出來這兩點。不斷地畫圖,作小例子,才體會到。多是我智商過低, 那麼久纔想出來,不過由本身親自想出來一個結論,而且獲得驗證,那種感受實在太美妙了!component

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\n", angle, velocity);
  }

  return 0;
}


 
相關文章
相關標籤/搜索