UVa 10387

UVa 10387

題目

http://domen111.github.io/UVa-Easy-Viewer/?10387

有一張長寬分別為 $a, b$ 的桌子,在他的正中央有一顆球,這顆球會以某個速度 $v$ ,以角度 $A$ 在桌子碰撞,分別在桌子的直向與橫向處撞擊 $m, n$ 次後回到初始位置

求這顆球的初速 $v$ 以及初始角度 $A$

並且假定球再碰撞過程中並無能量損耗,一切都是完美狀況

想法

可以先畫一張圖看看,會發現到球在碰撞的過程當中與橫向之間的角度,也就是初始角度 $A$ 都不會改變

並且由於無論如何球都必須要回到原點,每次碰撞過後為了回到原點,必須移動朝向方向(橫向或直向)移動一個長或寬的距離

所以我們可以透過 $a \times m$ 和 $b \times n$ 求到球在桌面上的橫向與直向的移動總距離

透過畢氏定理可以求得球的移動距離,再除以時間就會是速度

$$v = \frac{\sqrt{(am)^2+(bn)^2}}{s}
$$

角度的部分可以透過 $atan$ 求得

由於 C++ 經過 $atan$ 求到的是弧度,而題目要的是角度,所以要再另外計算一個弧度是多少角度 $angle=asin(1.0)/90$

$$A = \frac{atan(\frac{bn}{am})}{asin(1.0)/90}
$$

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const double radian = asin(1.0)/90;
int a,b,s,m,n;
int main(){
while(cin>>a>>b>>s>>m>>n && (a||b||s||m||n)){
double h_len = a*m;
double v_len = b*n;
double angle = atan(v_len/h_len)/radian;
double v = sqrt(pow(h_len,2)+pow(v_len,2))/s;
cout<<fixed<<setprecision(2)<<angle<<" "<<v<<"\n";
}
return 0;
}

時間複雜度分析

每次輸入的計算時間可估為 $O(1)$